#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
typedef pair<long long, int> lli;
const long long oo = ((1 << 30)-1)*2-1;
const int max_n = 5000+1;
int n, m;
long long min_d, dist = 0, f[max_n];
vector<lli> adj[max_n];
inline void load_map()
{
cin >> n >> m;
int type, u, v, w;
while (m--)
{
cin >> type >> u >> v >> w;
adj[u].push_back(lli(w, v));
if (type==2) adj[v].push_back(lli(w, u));
}
}
inline void dijkstra()
{
vector<lli>::iterator it;
long long cuv, du, d[max_n];
int u, v;
priority_queue<lli, vector<lli>, greater<lli> > heap;
for (u=1; u <= n; u++) d[u] = +oo;
memset(f, 0, sizeof(f));
d[1] = 0; f[1] = 1;
heap.push(lli(0, 1));
while (heap.size())
{
du = heap.top().first; u = heap.top().second;
heap.pop();
if (du != d[u]) continue;
if (u == n) break;
for (it=adj[u].begin(); it != adj[u].end(); it++)
{
cuv = it->first; v = it->second;
if (d[v]==d[u]+cuv) f[v] += f[u];
if (d[v] > d[u]+cuv)
{
d[v] = d[u]+cuv;
f[v] = f[u];
heap.push(lli(d[v], v));
}
}
}
min_d = d[n];
}
main()
{
load_map();
dijkstra();
cout << min_d << " " << f[n];
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgcGFpcjxsb25nIGxvbmcsIGludD4gbGxpOwoKY29uc3QgbG9uZyBsb25nIG9vID0gKCgxIDw8IDMwKS0xKSoyLTE7CmNvbnN0IGludCBtYXhfbiA9IDUwMDArMTsKCmludCBuLCBtOwpsb25nIGxvbmcgbWluX2QsIGRpc3QgPSAwLCBmW21heF9uXTsKdmVjdG9yPGxsaT4gYWRqW21heF9uXTsKCmlubGluZSB2b2lkIGxvYWRfbWFwKCkKewogICAgY2luID4+IG4gPj4gbTsKICAgIGludCB0eXBlLCB1LCB2LCB3OwogICAgd2hpbGUgKG0tLSkKICAgIHsKICAgICAgICBjaW4gPj4gdHlwZSA+PiB1ID4+IHYgPj4gdzsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKGxsaSh3LCB2KSk7CiAgICAgICAgaWYgKHR5cGU9PTIpIGFkalt2XS5wdXNoX2JhY2sobGxpKHcsIHUpKTsKICAgIH0KfQoKaW5saW5lIHZvaWQgZGlqa3N0cmEoKQp7CiAgICB2ZWN0b3I8bGxpPjo6aXRlcmF0b3IgaXQ7CiAgICBsb25nIGxvbmcgY3V2LCBkdSwgZFttYXhfbl07CiAgICBpbnQgdSwgdjsKICAgIHByaW9yaXR5X3F1ZXVlPGxsaSwgdmVjdG9yPGxsaT4sIGdyZWF0ZXI8bGxpPiA+IGhlYXA7CiAgICBmb3IgKHU9MTsgdSA8PSBuOyB1KyspIGRbdV0gPSArb287CiAgICBtZW1zZXQoZiwgMCwgc2l6ZW9mKGYpKTsKICAgIGRbMV0gPSAwOyBmWzFdID0gMTsKICAgIGhlYXAucHVzaChsbGkoMCwgMSkpOwogICAgd2hpbGUgKGhlYXAuc2l6ZSgpKQogICAgewogICAgICAgIGR1ID0gaGVhcC50b3AoKS5maXJzdDsgdSA9IGhlYXAudG9wKCkuc2Vjb25kOwogICAgICAgIGhlYXAucG9wKCk7CiAgICAgICAgaWYgKGR1ICE9IGRbdV0pIGNvbnRpbnVlOwogICAgICAgIGlmICh1ID09IG4pIGJyZWFrOwogICAgICAgIGZvciAoaXQ9YWRqW3VdLmJlZ2luKCk7IGl0ICE9IGFkalt1XS5lbmQoKTsgaXQrKykKICAgICAgICB7CiAgICAgICAgICAgIGN1diA9IGl0LT5maXJzdDsgdiA9IGl0LT5zZWNvbmQ7CiAgICAgICAgICAgIGlmIChkW3ZdPT1kW3VdK2N1dikgZlt2XSArPSBmW3VdOwogICAgICAgICAgICBpZiAoZFt2XSA+IGRbdV0rY3V2KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkW3ZdID0gZFt1XStjdXY7CiAgICAgICAgICAgICAgICBmW3ZdID0gZlt1XTsKICAgICAgICAgICAgICAgIGhlYXAucHVzaChsbGkoZFt2XSwgdikpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbWluX2QgPSBkW25dOwp9CgptYWluKCkKewogICAgbG9hZF9tYXAoKTsKICAgIGRpamtzdHJhKCk7CiAgICBjb3V0IDw8IG1pbl9kIDw8ICIgIiA8PCBmW25dOwp9