#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; using Graph = vector>; using ll = long long; typedef pair P_ll; typedef pair P; const ll INF_ll = 1e17; const int INF = 1e8; template bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; } template bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; } template using min_priority_queue = priority_queue, greater>; int main() { int n, m; cin >> n >> m; vector> G(n); for (int i = 0; i < m; i++) { ll s, t, d; cin >> s >> t >> d; s--; t--; G[s].push_back({t, d}); G[t].push_back({s, d}); } ll ok = 0; ll ng = 1e9 + 1; ll ans = -1; while (ng - ok > 1) { ll mid = (ok + ng) / 2; vector d(n, -1); d[0] = 0; queue q; q.push(0); while (!q.empty()) { auto u = q.front(); q.pop(); for (auto e : G[u]) { if (e.second < mid) { continue; } int next = e.first; if (d[next] >= 0) { continue; } d[next] = d[u] + 1; q.push(next); } } if (d[n - 1] >= 0) { ok = mid; ans = d[n - 1]; } else { ng = mid; } } cout << ok << " " << ans << endl; return 0; }