#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int d[2005];
int ans[2005];
bool v[2005];
struct node{
int x,y,w;
friend bool operator>(node a,node b){
return a.w>b.w;
}
};
vector<node>a[2005];
priority_queue<node,vector<node>,greater<node> >q;
void dj(int x){
for(int i=1;i<=n;i++)
d[i]=(1LL<<40);
d[x]=0;
ans[x]=1;
q.push({x,x,d[x]});
v[x]=1;
while(!q.empty()){
node u=q.top();
q.pop();
v[u.y]=0;
for(auto i:a[u.y]){
if(d[i.y]>d[u.y]+i.w){
d[i.y]=d[u.y]+i.w;
if(!v[i.y])q.push({u.y,i.y,d[i.y]}),v[i.y]=1;
}
if(d[i.y]==d[u.y]+i.w){
ans[i.y]+=ans[u.y];
}
}
}
}
bool cmp(node a,node b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
vector<node> hand_write_unique(vector<node>a){
vector<node>ans;
ans.clear();
int l=a.size();
for(int i=0;i<l;i++){
while(i<l&&a[i].x==a[i+1].x&&a[i].y==a[i+1].y)i++;
ans.push_back(a[i]);
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,w;
cin>>x>>y>>w;
a[x].push_back({x,y,w});
}
for(int i=1;i<=n;i++){
sort(a[i].begin(),a[i].end(),cmp);
a[i]=hand_write_unique(a[i]);
}
dj(1);
if(d[n]!=(1LL<<40))cout<<d[n]<<" "<<ans[n];
else cout<<"No answer";
return 0;
}