#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const int MAX_N = 100010; struct Edge { int to; int d; Edge(int to = -1, int d = -1) { this->to = to; this->d = d; } }; struct Node { int v; int dist; Node(int v = -1, int dist = -1) { this->v = v; this->dist = dist; } }; int N, M; vector E[MAX_N]; bool visited[MAX_N]; int f(int w) { queue que; que.push(Node(1, 0)); memset(visited, false, sizeof(visited)); while (!que.empty()) { Node node = que.front(); que.pop(); if (visited[node.v]) continue; visited[node.v] = true; if (node.v == N) { return node.dist; } for (Edge e : E[node.v]) { if (w > e.d) continue; que.push(Node(e.to, node.dist + 1)); } } return -1; } int main() { int ok = 0; int ng = INT_MAX / 2; cin >> N >> M; int s, t, d; for (int i = 0; i < M; ++i) { cin >> s >> t >> d; E[s].push_back(Edge(t, d)); E[t].push_back(Edge(s, d)); } while (abs(ok - ng) >= 2) { int w = (ok + ng) / 2; if (f(w) != -1) { ok = w; } else { ng = w; } } cout << ok << " " << f(ok) << endl; return 0; }