#include<cstdio>
#include<iostream>
#include<vector>
#include<cmath>
#include<queue>
using namespace std;
struct edge{
int to,w;
};
vector<edge> a[2005];
int d[2005],ans[2005];
bool exi[2005][2005][11];
bool vis[2005];
int main(){
int n,m;
scanf("%d%d",&n,&m);
fill(d+1,d+n+1,1e9+114);
priority_queue <pair<int,int>,vector<pair<int,int> > ,greater<pair<int,int> > > q;
for(int i=1;i<=m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(exi[u][v][w]||exi[v][u][w])continue;
exi[u][v][w]=exi[v][u][w]=true;
a[u].push_back({v,w});
a[v].push_back({u,w});
}
q.push(make_pair(0,1));
ans[1]=1;
d[1]=0;
while(!q.empty()){
int tp=q.top().second;
q.pop();
for(edge i:a[tp]){
if(d[i.to]>d[tp]+i.w){
d[i.to]=d[tp]+i.w;
q.push(make_pair(d[i.to],i.to));
ans[i.to]=0;
}
if(d[i.to]==d[tp]+i.w)ans[i.to]+=ans[tp];
}
}
if(d[n]==1e9+114&&ans[n]==0)puts("No answer");
else printf("%d %d\n",d[n],ans[n]);
return 0;
}