#include <bits/stdc++.h>
using namespace std;
//variable
#define ld long double
#define ll long long
#define db double
#define ii pair<int,int>
#define f first
#define s second
#define mp make_pair
#define mt make_tuple
//vector
#define pb push_back
#define all(v) v.begin(),v.end()
#define len(a) (int)a.length()
#define sz(a) (int)a.size()
//mask
#define BIT(i) (1LL<<(i))
//better code, debugger
#define watch(n) cerr << #n << ": " << n << endl
#define debug(x) for (auto p: x) cerr<<p<<' ';cerr<<endl
#define forw(i,j,z) for(int i=(int)j;i<=(int)z;i++)
#define ford(i,j,z) for (int i=(int)j;i>=(int)z;i--)
#define fIlE "test."
//auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
//mt19937 RAND(seed);
const int mod = 1e9 + 7;
inline int add(int u,int v){u+=v;if(u>=mod)u-=mod;return u;}
inline int dec(int u,int v){u-=v;if(u<0)u+=mod;return u;}
inline int mul(int u,int v){return (ll)u*v%mod;}
#define tt pair<ll, int>
const ll inf = 1e16;
int n, m;
vector<ii> a[100000 + 100];
ll dist[100000 + 100];
int ways[100000 + 100], Min[100000 + 100], Max[100000 + 100];
void solve()
{
cin >> n >> m;
while(m--){
int u, v, d;
cin >> u >> v >> d;
a[u].pb(mp(v, d));
}
priority_queue<tt, vector<tt>, greater<tt> > haha;
forw(i, 1, n)
dist[i] = inf, ways[i] = 0, Min[i] = Max[i] = 0;
haha.push(mp(dist[1] = 0, 1));
ways[1] = 1;
Min[1] = 0;
Max[1] = 0;
while(!haha.empty())
{
int u; ll d;
u = haha.top().s, d = haha.top().f;
haha.pop();
if (dist[u] < d) continue;
for (auto [v, e] : a[u])
{
if (dist[v] > e + d)
{
dist[v] = e + d;
ways[v] = ways[u];
Min[v] = Min[u] + 1;
Max[v] = Max[u] + 1;
haha.push(mp(dist[v], v));
}
else if (dist[v] == e + d){
ways[v] = add(ways[v], ways[u]);
Min[v] = min(Min[v], Min[u] + 1);
Max[v] = max(Max[v], Max[u] + 1);
}
}
}
cout << dist[n] << ' ' << ways[n] << ' ' << Min[n] << ' ' << Max[n];
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
if (fopen(fIlE"inp", "r"))
freopen(fIlE"inp","r",stdin), freopen(fIlE"out","w",stdout);
//time_t TIME_TU=clock();
int t=1;
// cin>>t;
while(t--)
solve();
//time_t TIME_TV=clock();
//cerr<<(db)(TIME_TV-TIME_TU)/CLOCKS_PER_SEC<<endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vdmFyaWFibGUKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgcyBzZWNvbmQKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBtdCBtYWtlX3R1cGxlCi8vdmVjdG9yCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgbGVuKGEpIChpbnQpYS5sZW5ndGgoKQojZGVmaW5lIHN6KGEpIChpbnQpYS5zaXplKCkKLy9tYXNrCiNkZWZpbmUgQklUKGkpICgxTEw8PChpKSkKLy9iZXR0ZXIgY29kZSwgZGVidWdnZXIKI2RlZmluZSB3YXRjaChuKSBjZXJyIDw8ICNuIDw8ICI6ICIgPDwgbiA8PCBlbmRsCiNkZWZpbmUgZGVidWcoeCkgZm9yIChhdXRvIHA6IHgpIGNlcnI8PHA8PCcgJztjZXJyPDxlbmRsCiNkZWZpbmUgZm9ydyhpLGoseikgZm9yKGludCBpPShpbnQpajtpPD0oaW50KXo7aSsrKQojZGVmaW5lIGZvcmQoaSxqLHopIGZvciAoaW50IGk9KGludClqO2k+PShpbnQpejtpLS0pCiNkZWZpbmUgZklsRSAidGVzdC4iCi8vYXV0byBzZWVkID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpOwovL210MTk5MzcgUkFORChzZWVkKTsKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CmlubGluZSBpbnQgYWRkKGludCB1LGludCB2KXt1Kz12O2lmKHU+PW1vZCl1LT1tb2Q7cmV0dXJuIHU7fQppbmxpbmUgaW50IGRlYyhpbnQgdSxpbnQgdil7dS09djtpZih1PDApdSs9bW9kO3JldHVybiB1O30KaW5saW5lIGludCBtdWwoaW50IHUsaW50IHYpe3JldHVybiAobGwpdSp2JW1vZDt9CiNkZWZpbmUgdHQgcGFpcjxsbCwgaW50Pgpjb25zdCBsbCBpbmYgPSAxZTE2OwppbnQgbiwgbTsKdmVjdG9yPGlpPiBhWzEwMDAwMCArIDEwMF07CmxsIGRpc3RbMTAwMDAwICsgMTAwXTsKaW50IHdheXNbMTAwMDAwICsgMTAwXSwgTWluWzEwMDAwMCArIDEwMF0sIE1heFsxMDAwMDAgKyAxMDBdOwp2b2lkIHNvbHZlKCkKewogICAgY2luID4+IG4gPj4gbTsKICAgIHdoaWxlKG0tLSl7CiAgICAgICAgaW50IHUsIHYsIGQ7CiAgICAgICAgY2luID4+IHUgPj4gdiA+PiBkOwogICAgICAgIGFbdV0ucGIobXAodiwgZCkpOwogICAgfQogICAgcHJpb3JpdHlfcXVldWU8dHQsIHZlY3Rvcjx0dD4sIGdyZWF0ZXI8dHQ+ID4gaGFoYTsKICAgIGZvcncoaSwgMSwgbikKICAgICAgICBkaXN0W2ldID0gaW5mLCB3YXlzW2ldID0gMCwgTWluW2ldID0gTWF4W2ldID0gMDsKICAgIGhhaGEucHVzaChtcChkaXN0WzFdID0gMCwgMSkpOwogICAgd2F5c1sxXSA9IDE7CiAgICBNaW5bMV0gPSAwOwogICAgTWF4WzFdID0gMDsKICAgIHdoaWxlKCFoYWhhLmVtcHR5KCkpCiAgICB7CiAgICAgICAgaW50IHU7IGxsIGQ7CiAgICAgICAgdSA9IGhhaGEudG9wKCkucywgZCA9IGhhaGEudG9wKCkuZjsKICAgICAgICBoYWhhLnBvcCgpOwogICAgICAgIGlmIChkaXN0W3VdIDwgZCkgY29udGludWU7CiAgICAgICAgZm9yIChhdXRvIFt2LCBlXSA6IGFbdV0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoZGlzdFt2XSA+IGUgKyBkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXN0W3ZdID0gZSArIGQ7CiAgICAgICAgICAgICAgICB3YXlzW3ZdID0gd2F5c1t1XTsKICAgICAgICAgICAgICAgIE1pblt2XSA9IE1pblt1XSArIDE7CiAgICAgICAgICAgICAgICBNYXhbdl0gPSBNYXhbdV0gKyAxOwogICAgICAgICAgICAgICAgaGFoYS5wdXNoKG1wKGRpc3Rbdl0sIHYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkaXN0W3ZdID09IGUgKyBkKXsKICAgICAgICAgICAgICAgIHdheXNbdl0gPSBhZGQod2F5c1t2XSwgd2F5c1t1XSk7CiAgICAgICAgICAgICAgICBNaW5bdl0gPSBtaW4oTWluW3ZdLCBNaW5bdV0gKyAxKTsKICAgICAgICAgICAgICAgIE1heFt2XSA9IG1heChNYXhbdl0sIE1heFt1XSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCBkaXN0W25dIDw8ICcgJyA8PCB3YXlzW25dIDw8ICcgJyA8PCBNaW5bbl0gPDwgJyAnIDw8IE1heFtuXTsKfQpzaWduZWQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgIGlmIChmb3BlbihmSWxFImlucCIsICJyIikpCiAgICAgICAgZnJlb3BlbihmSWxFImlucCIsInIiLHN0ZGluKSwgZnJlb3BlbihmSWxFIm91dCIsInciLHN0ZG91dCk7CiAgICAvL3RpbWVfdCBUSU1FX1RVPWNsb2NrKCk7CiAgICBpbnQgdD0xOwovLyAgICBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pCiAgICAgICAgc29sdmUoKTsKICAgIC8vdGltZV90IFRJTUVfVFY9Y2xvY2soKTsKICAgIC8vY2Vycjw8KGRiKShUSU1FX1RWLVRJTUVfVFUpL0NMT0NLU19QRVJfU0VDPDxlbmRsOwogICAgcmV0dXJuIDA7Cn0K