#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct edge
{
int nxt,v,w;
}a[100005];
int n,m,cnt,head[100005],dis[100005],ans[100005],vis[100005],mp[2005][2005];
void addedge(int u,int v,int w)
{
a[++cnt].v=v;
a[cnt].w=w;
a[cnt].nxt=head[u];
head[u]=cnt;
}
queue<int>q;
void spfa()
{
q.push(1);
memset(dis,0x3f,sizeof(dis));
vis[1]=1;
dis[1]=0;
ans[1]=1;
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=0;
for(int i=head[now];i;i=a[i].nxt)
{
int to=a[i].v;
if(dis[to]>dis[now]+a[i].w)
{
dis[to]=dis[now]+a[i].w;
ans[to]=ans[now];
if(!vis[to])
{
q.push(to);
vis[to]=1;
}
}
else if(dis[to]==dis[now]+a[i].w)
{
ans[to]+=ans[now];
if(!vis[to])
{
q.push(to);
vis[to]=1;
}
}
}
if(now!=n)ans[now]=0;
}
}
int main()
{
cin>>n>>m;
memset(mp,0x3f,sizeof(mp));
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
if(w<mp[u][v])
{
mp[u][v]=w;
addedge(u,v,w);
}
}
spfa();
if(dis[n]==1061109567)
cout<<"No answer";
else
cout<<dis[n]<<" "<<ans[n];
return 0;
}
RT,本蒟蒻是真的检查不出来有什么问题了。。。