#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000+10;
int n,m;
int dis[maxn],cnt[maxn];
bool vis[maxn];
struct node{
int to,w;
node(int t,int ww){
to=t; w=ww;
}
};
vector<node> vec[maxn*2];
struct qnode{
int id,d;
qnode(int i,int j){
id=i; d=j;
}
bool friend operator <(qnode a,qnode b){
return a.d>b.d;
}
};
priority_queue<qnode> q;
void dij(int s){
memset(dis,0x7f,sizeof(dis));
memset(cnt,0,sizeof(cnt));
memset(vis,false,sizeof(vis));
q.push(qnode(s,0));
cnt[s]=1;
dis[s]=0;
while(!q.empty()){
int u=q.top().id; q.pop();
if(vis[u]==true) continue;
vis[u]=true;
for(int i=0;i<vec[u].size();i++){
int v=vec[u][i].to;
if(dis[v]>dis[u]+vec[u][i].w){
dis[v]=dis[u]+vec[u][i].w;
cnt[v]=cnt[u];
if(!vis[v]) q.push(qnode(v,dis[v]));
}else if(dis[v]==dis[u]+vec[u][i].w) cnt[v]=(cnt[v]+cnt[u]);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
vec[u].push_back(node(v,w));
}
dij(1);
if(dis[n]>=0x7f) cout<<"No answer";
else cout<<dis[n]<<" "<<cnt[n];
return 0;
}