#include<bits/stdc++.h>
using namespace std;
const int maxn=20010;
const int maxxn=25000010;
int head[maxn],vis[maxn],dis[maxn],cnt[maxn],tot,n,m;
struct e{
int u,v,w,nxt;
}edge[maxxn];
void add(int u,int v,int w){
edge[++tot].u=u;
edge[tot].v=v;
edge[tot].w=w;
edge[tot].nxt=head[u];
head[u]=tot;
}
struct node{
int w,now;
inline bool operator<(const node&x) const
{
return w>x.w;
}
};
priority_queue<node> q;
void dij(int s){
memset(dis,707406378,sizeof(dis));
dis[s]=0;
cnt[s]=1;
q.push(node{0,s});
while(!q.empty()){
node x=q.top();
q.pop();
long long u=x.now;
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
if(dis[v]>dis[u]+edge[i].w){
dis[v]=dis[u]+edge[i].w;
cnt[v]=cnt[u];
q.push(node{dis[v],v});
}
else if(dis[v]==dis[u]+edge[i].w){
cnt[v]+=cnt[u];
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
}
dij(1);
if(dis[n]==707406378){
cout<<"No answer"<<endl;
return 0;
}
else
cout<<dis[n]<<" "<<cnt[n]<<endl;
return 0;
}