#include<bits/stdc++.h>
using namespace std;
struct Node{
int v,w;
};
bool operator < (Node a,Node b){
return a.w>b.w;
}
priority_queue<Node>q;
int n,b,dis[200005],cnt[200005];
bool y[200005];
vector<Node>m[200005];
void dijkstra(){
for(int i=1;i<=n;i++) dis[i]=0x3f3f3f3f,y[i]=0,cnt[i]=0;
q.push({1,0});dis[1]=0;
while(!q.empty()){
Node net=q.top();q.pop();
if(y[net.v]) continue;
y[net.v]=1;
for(int i=0;i<m[net.v].size();i++){
int v=m[net.v][i].v;
if(dis[v]>dis[net.v]+m[net.v][i].w) dis[v]=dis[net.v]+m[net.v][i].w,cnt[v]=1;
else if(dis[v]==dis[net.v]+m[net.v][i].w) cnt[v]+=cnt[net.v];
if(y[v]==0) q.push({v,dis[v]});
}
}
}
void push(int u,int v,int w){
for(int i=0;i<m[u].size();i++){
if(m[u][i].v==v){
m[u][i].w=min(m[u][i].w,w);
return;
}
}
m[u].push_back({v,w});
}
int main(){
cin>>n>>b;
for(int i=1,u,v,w;i<=b;i++){
cin>>u>>v>>w;
push(u,v,w);
push(v,u,w);
}
dijkstra();
cout<<dis[n]<<" "<<cnt[n];
return 0;
}