#include<bits/stdc++.h>
using namespace std;
int n, m, dis[2005], cnt[2005], vi[2005];
vector<pair<int, int> >g[2005];
priority_queue<pair<int,int>,vector<pair<int, int> >,greater<pair<int,int> > > q;
#define inf 0x3f3f3f3f
void dijk() {
dis[1] = 0;
cnt[1] = 1;
q.push({0, 1});
while(!q.empty()) {
pair<int, int> p = q.top();
q.pop();
int w = p.first, u = p.second;
if(vi[u]) continue;
vi[u] = 1;
for(auto [v, $] : g[u])
if(w + $ < dis[v]){
dis[v] = w + $, cnt[v] = cnt[u];
if(!vi[v])
q.push({w + $, v});
}
else if(w + $ == dis[v])
cnt[v] += cnt[u];
}
}
signed main() {
cin >> n >> m;
for(int i = 1;i <= m;i ++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
}
for(int u = 1;u <= n;u ++) {
sort(g[u].begin(), g[u].end());
for(int j = 0;j + 1 < g[u].size();j ++)
if(g[u][j].first == g[u][j + 1].first)
g[u][j].second = min(g[u][j].second, g[u][j + 1].second),
swap(g[u][j + 1], g[u][g[u].size() - 1]),
g[u].pop_back();
}
memset(dis, inf, sizeof dis);
dijk();
if(dis[n] == inf) cout << "No answer";
else cout << dis[n] << " " << cnt[n];
}