#include using namespace std; #define ll long long #define rep(i, n) for (int i = 0; i < (n); i++) #define P pair struct Edge { int to, w; Edge(int to, int w) : to(to), w(w) {} }; int main() { int n, m; cin >> n >> m; vector> G(n); rep(i, m) { int s, t, d; cin >> s >> t >> d; s--, t--; G[s].push_back(Edge(t, d)); G[t].push_back(Edge(s, d)); } vector weight(100005, 0); const int INF = 1001001001; weight[0] = INF; priority_queue> q; q.push({INF,0}); while(!q.empty()) { int w = q.top().first, v = q.top().second; q.pop(); rep(j, G[v].size()) { Edge e = G[v][j]; int nv = e.to, cost = e.w; if (min(w, cost) > weight[nv]) { weight[nv] = min(w,cost); q.push({weight[nv], nv}); } } } int ans_w = weight[n-1]; vector dist(100004, INF); dist[0] = 0; queue que; que.push(0); while(!que.empty()) { int v = que.front(); que.pop(); rep(i, G[v].size()) { Edge e = G[v][i]; int nv = e.to, cost = e.w; if (dist[nv] != INF) continue; if (cost < ans_w) continue; dist[nv] = dist[v]+1; que.push(nv); } } int ans_d = dist[n-1]; cout << ans_w << " " << ans_d << endl; }