#include<bits/stdc++.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <numeric>
#include <bitset>
#define endl '\n'
#define ll long long
#define all(n) n.begin() , n.end( )
#define vi vector<int>
#define vvi vector<vi>
#define int long long
#define pii pair<int,int>
#define vpii vector<pair<int,int>>
#define mii map<int,int>
#define si set<int>
#define input(v,n) for(int i = 0 ; i< n ; i++) cin >> v[i]
#define output(v) for(auto it : v) cout << it << endl;
#define IS_POWER_OF_TWO(n) ((n) && !((n) & ((n) - 1)))
#define bug(...) _f (#__VA_ARGS__,__VA_ARGS__)
#define lb(x,w,z) for(int x=w;x<z;x++)
#define FOR (x,y) for(auto x:y)
#define revlop(a,b,c) for(int a=b;a>=c;a--)
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace std;
// using namespace __gnu_pbds;
// template<class t> using ordered_multiset = tree<t, null_type, less<t>, rb_tree_tag, tree_order_statistics_node_update>;
//---------------------------------------------------------------
int dx[] = {0, 0, -1, 1, -1, -1, 1, 1};
int dy[] = {1, -1, 0, 0, 1, -1, 1, -1};
using namespace std;
void fast() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
// const ll N= 2e6+5;
// ll pre[N],pre2[N],next_arr[N],arr[N],bb[N] ;
/*
ll sqrtt(ll n){
ll l{},r= 1000000000+1,mid;
while(r-l>1){
mid = l+(r-l)/2;
if( mid * mid > n )r=mid;
else l =mid;
}
return l;
}
ll lcm ( ll a , ll b)
{
return (a*b)/gcd(a,b);
}
ll fast_power(ll a,ll b , int mod){
ll ans=1;
while(b){
if(b&1){
ans*=a;
ans%=mod;
}
a*=a;
a%=mod;
b = (b>>1);
}
return ans;
}
/*
ll gcd ( ll a, ll b)
{
if ( b == 0 )
return a;
return gcd(b, a%b);
}
vector<int> vis(N);
vector<int> prime(N ) ;
void get_prime(){
prime[0] = 0 , prime[1] = 1 ;
for (int i = 2 ; i<= N ; i++){
if ( !prime[i] ){
for (int j = i ; j <= N ; j+=i)
prime[j] = i ;
}
}
}
vi prims(N);
void seive(int n ){
prims[0] = prims[1] = 1;
for (int i = 2 ; i* i <= n ; i++){
if ( !prims[i] ){
prims[i] = 0 ;
for (int j = 2*i ; j <= n ; j+=i ){
prims[j] = 1;
}
}
}
}
vector<int> prim_fac(ll n ){
vector<int> v;
for (int i = 2 ; i*i <= n ;i ++ ){
while (n != 1 ){
if ( n % i == 0 ){
n/=i;
v.push_back(i);
}
else break;
}
}
return v;
}
bool is_prime(int n)
{
bool isprime = true;
if ( n == 1)
return false;
for (int i = 2 ; i * i <= n ; i++)
{
if ( n %i == 0 )
isprime = false;
}
return isprime;
}*/
const ll oo = 1e18+2 , mod = 1e9+7 ;
const int N = 1e5+5;
vector<pair<int,int>> adj[N] ;
vector<int> dist(N, oo) , ans , path(N) , mn (N) , mx(N) ;
map<int,int> mp;
map<int, vector<int>> flights;
int n , m , k ;
void dijkstra( int src ) {
priority_queue< pii , vector<pii> , greater<>> pq;
pq.push({ 0, src});
dist[src] = 0 ;
mn[1] = 0 , mx [1 ] = 0 , path[1] = 1 ;
while ( !pq.empty()){
int curr = pq.top().second;
int d = pq.top().first;
pq.pop();
if ( dist[curr] != d){
continue;
}
for (auto it : adj[curr]){
if ( dist[it.first] > it.second + d ){
dist[it.first] = it.second + d ;
pq.push({dist[it.first] , it.first});
path[it.first] = path[curr];
mn[it.first] = mn[curr]+1;
mx[it.first] = mx[curr] + 1 ;
}
else if ( dist[it.first] == it.second + d ){
path[it.first] = ( path[it.first] % mod + path[curr]%mod ) % mod ;
mn[it.first] = min ( mn[it.first] , mn[curr] +1 );
mx[it.first] = max ( mx[it.first] , mx[curr] +1 );
}
}
}
}
void solve( ){
cin >> n >> m ;
while ( m -- ){
int a , b , w ;
cin >> a >> b >> w ;
adj[a].push_back({b,w });
}
dijkstra(1);
cout << dist[n] << ' ' << path[n] << ' ' << mn[n] <<' '<< mx[n] << endl;
}
signed main( )
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
//#endif
fast();
int t =1;
clock_t w =clock();
// cin >> t ;
while ( t -- ){
solve();
}
// cerr << "Run time : " << ((double) (clock() - w) / CLOCKS_PER_SEC);
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8Yml0c2V0PgojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGFsbChuKSBuLmJlZ2luKCkgLCBuLmVuZCggKQojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdnZpIHZlY3Rvcjx2aT4KI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgcGlpIHBhaXI8aW50LGludD4KI2RlZmluZSB2cGlpIHZlY3RvcjxwYWlyPGludCxpbnQ+PgojZGVmaW5lIG1paSBtYXA8aW50LGludD4KI2RlZmluZSBzaSBzZXQ8aW50PgojZGVmaW5lIGlucHV0KHYsbikgZm9yKGludCBpID0gMCA7IGk8IG4gOyBpKyspIGNpbiA+PiB2W2ldCiNkZWZpbmUgb3V0cHV0KHYpICBmb3IoYXV0byBpdCA6IHYpIGNvdXQgPDwgaXQgPDwgZW5kbDsKI2RlZmluZSBJU19QT1dFUl9PRl9UV08obikgKChuKSAmJiAhKChuKSAmICgobikgLSAxKSkpCiNkZWZpbmUgYnVnKC4uLikgX2YgKCNfX1ZBX0FSR1NfXyxfX1ZBX0FSR1NfXykKCiNkZWZpbmUgbGIoeCx3LHopIGZvcihpbnQgeD13O3g8ejt4KyspCiNkZWZpbmUgRk9SICh4LHkpIGZvcihhdXRvIHg6eSkKI2RlZmluZSByZXZsb3AoYSxiLGMpIGZvcihpbnQgYT1iO2E+PWM7YS0tKQoKLy8gI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgovLyAjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KLy8gdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8gdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7Ci8vIHRlbXBsYXRlPGNsYXNzIHQ+IHVzaW5nIG9yZGVyZWRfbXVsdGlzZXQgPSB0cmVlPHQsIG51bGxfdHlwZSwgbGVzczx0PiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppbnQgZHhbXSA9IHswLCAwLCAtMSwgMSwgLTEsIC0xLCAxLCAxfTsKaW50IGR5W10gPSB7MSwgLTEsIDAsIDAsIDEsIC0xLCAxLCAtMX07Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkIGZhc3QoKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjb3V0LnRpZShOVUxMKTsKfQoKLy8gY29uc3QgbGwgIE49IDJlNis1OwovLyBsbCAgcHJlW05dLHByZTJbTl0sbmV4dF9hcnJbTl0sYXJyW05dLGJiW05dIDsKLyoKCmxsIHNxcnR0KGxsIG4pewpsbCBse30scj0gMTAwMDAwMDAwMCsxLG1pZDsKd2hpbGUoci1sPjEpewogICAgbWlkID0gbCsoci1sKS8yOwogICAgaWYoIG1pZCAqIG1pZCA+IG4gKXI9bWlkOwogICAgZWxzZSBsID1taWQ7Cn0KcmV0dXJuIGw7Cn0KCmxsIGxjbSAoIGxsIGEgLCBsbCBiKQp7CiAgICByZXR1cm4gKGEqYikvZ2NkKGEsYik7Cn0KCmxsIGZhc3RfcG93ZXIobGwgYSxsbCBiICwgaW50IG1vZCl7CiAgICBsbCBhbnM9MTsKICAgIHdoaWxlKGIpewogICAgaWYoYiYxKXsKICAgICAgICBhbnMqPWE7CiAgICAgICAgYW5zJT1tb2Q7CiAgICB9CiAgICBhKj1hOwogICAgYSU9bW9kOwogICAgYiA9IChiPj4xKTsKfQpyZXR1cm4gYW5zOwp9Ci8qCmxsIGdjZCAoIGxsIGEsIGxsIGIpCnsKICAgIGlmICggYiA9PSAwICkKICAgICAgICByZXR1cm4gYTsKICAgIHJldHVybiBnY2QoYiwgYSViKTsKfQp2ZWN0b3I8aW50PiB2aXMoTik7CnZlY3RvcjxpbnQ+IHByaW1lKE4gKSA7CnZvaWQgZ2V0X3ByaW1lKCl7CiAgICBwcmltZVswXSA9IDAgLCBwcmltZVsxXSA9IDEgOwogICAgZm9yIChpbnQgaSA9IDIgOyBpPD0gTiA7IGkrKyl7CiAgICAgICAgaWYgKCAhcHJpbWVbaV0gICl7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpIDsgaiA8PSBOIDsgais9aSkKICAgICAgICAgICAgICAgIHByaW1lW2pdID0gaSA7CgogICAgICAgIH0KICAgIH0KfQoKdmkgcHJpbXMoTik7CnZvaWQgc2VpdmUoaW50IG4gKXsKICAgIHByaW1zWzBdID0gcHJpbXNbMV0gPSAxOwogICAgZm9yIChpbnQgIGkgPSAyIDsgaSogaSA8PSBuIDsgaSsrKXsKICAgICAgICBpZiAoICFwcmltc1tpXSApewogICAgICAgICAgICBwcmltc1tpXSAgPSAwIDsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDIqaSA7IGogPD0gbiA7IGorPWkgKXsKICAgICAgICAgICAgICAgIHByaW1zW2pdID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdmVjdG9yPGludD4gcHJpbV9mYWMobGwgbiApewogICAgdmVjdG9yPGludD4gdjsKICAgIGZvciAoaW50IGkgPSAyIDsgaSppIDw9IG4gO2kgKysgKXsKICAgICAgICB3aGlsZSAobiAhPSAxICl7CiAgICAgICAgICAgIGlmICggbiAlIGkgPT0gMCApewogICAgICAgICAgICAgICAgbi89aTsKICAgICAgICAgICAgICAgIHYucHVzaF9iYWNrKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHY7Cn0KCmJvb2wgaXNfcHJpbWUoaW50IG4pCnsKICAgIGJvb2wgaXNwcmltZSA9IHRydWU7CiAgICBpZiAoIG4gPT0gMSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMiA7IGkgKiBpIDw9IG4gOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCBuICVpID09IDAgKQogICAgICAgICAgICBpc3ByaW1lID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gaXNwcmltZTsKfSovCgoKCmNvbnN0ICBsbCBvbyA9IDFlMTgrMiAsIG1vZCA9IDFlOSs3IDsKY29uc3QgIGludCBOID0gMWU1KzU7CgoKCgp2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gYWRqW05dIDsKdmVjdG9yPGludD4gZGlzdChOLCBvbykgLCBhbnMgLCBwYXRoKE4pICwgbW4gKE4pICwgbXgoTikgOwoKbWFwPGludCxpbnQ+IG1wOwoKbWFwPGludCwgdmVjdG9yPGludD4+IGZsaWdodHM7CiAgICAKaW50IG4gLCBtICwgayA7Cgp2b2lkIGRpamtzdHJhKCBpbnQgc3JjICkgeyAKICAgIHByaW9yaXR5X3F1ZXVlPCBwaWkgLCB2ZWN0b3I8cGlpPiAsIGdyZWF0ZXI8Pj4gcHE7CiAgICBwcS5wdXNoKHsgMCwgc3JjfSk7CiAgICBkaXN0W3NyY10gPSAwIDsKICAgIG1uWzFdID0gMCAsIG14IFsxIF0gPSAwICwgcGF0aFsxXSA9IDEgOwogICAgd2hpbGUgKCAhcHEuZW1wdHkoKSl7CiAgICAgICAgaW50IGN1cnIgPSBwcS50b3AoKS5zZWNvbmQ7CiAgICAgICAgaW50IGQgPSBwcS50b3AoKS5maXJzdDsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpZiAoIGRpc3RbY3Vycl0gIT0gZCl7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBmb3IgKGF1dG8gaXQgOiBhZGpbY3Vycl0pewogICAgICAgICAgICBpZiAoIGRpc3RbaXQuZmlyc3RdID4gaXQuc2Vjb25kICsgZCApewogICAgICAgICAgICAgICAgZGlzdFtpdC5maXJzdF0gPSBpdC5zZWNvbmQgKyBkIDsKICAgICAgICAgICAgICAgIHBxLnB1c2goe2Rpc3RbaXQuZmlyc3RdICwgaXQuZmlyc3R9KTsKICAgICAgICAgICAgICAgIHBhdGhbaXQuZmlyc3RdID0gcGF0aFtjdXJyXTsKICAgICAgICAgICAgICAgIG1uW2l0LmZpcnN0XSA9IG1uW2N1cnJdKzE7CiAgICAgICAgICAgICAgICBteFtpdC5maXJzdF0gPSBteFtjdXJyXSArIDEgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBkaXN0W2l0LmZpcnN0XSA9PSBpdC5zZWNvbmQgKyBkICl7CiAgICAgICAgICAgICAgICBwYXRoW2l0LmZpcnN0XSA9ICggcGF0aFtpdC5maXJzdF0gJSBtb2QgKyBwYXRoW2N1cnJdJW1vZCAgKSAlIG1vZCA7CiAgICAgICAgICAgICAgICBtbltpdC5maXJzdF0gPSBtaW4gKCBtbltpdC5maXJzdF0gLCBtbltjdXJyXSArMSApOwogICAgICAgICAgICAgICAgbXhbaXQuZmlyc3RdID0gbWF4ICggbXhbaXQuZmlyc3RdICwgbXhbY3Vycl0gKzEgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCn0KCgp2b2lkIHNvbHZlKCApewogICAgY2luID4+IG4gPj4gbSAgOwogICAgd2hpbGUgKCBtIC0tICl7CiAgICAgICAgaW50IGEgLCBiICwgdyA7CiAgICAgICAgY2luID4+IGEgID4+ICBiID4+IHcgOwogICAgICAgIGFkalthXS5wdXNoX2JhY2soe2IsdyB9KTsKICAgIH0KICAgIGRpamtzdHJhKDEpOwogICAgY291dCA8PCBkaXN0W25dIDw8ICcgJyA8PCBwYXRoW25dIDw8ICcgJyA8PCBtbltuXSA8PCcgJzw8IG14W25dIDw8IGVuZGw7CiAgICAgCiAgICAKfQoKc2lnbmVkIG1haW4oICkKewogICAgLy8gICBmcmVvcGVuKCJpbnB1dC50eHQiLCJyIixzdGRpbik7CiAgICAvLyAgZnJlb3Blbigib3V0cHV0LnR4dCIsInciLHN0ZG91dCk7Ci8vI2VuZGlmCiAgICBmYXN0KCk7CiAgICBpbnQgdCA9MTsKICAgIGNsb2NrX3QgdyA9Y2xvY2soKTsKICAgIC8vIGNpbiA+PiB0IDsKICAgIHdoaWxlICggdCAtLSApewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICAgICAgCi8vIGNlcnIgPDwgIlJ1biB0aW1lIDogIiA8PCAoKGRvdWJsZSkgKGNsb2NrKCkgLSB3KSAvIENMT0NLU19QRVJfU0VDKTsKfQo=