#include #include #include #include #include using namespace std; vector > graph[300]; int n, m; struct node { int idx, shortest_path; node(int _idx, int _shortest_path) { idx = _idx; shortest_path = _shortest_path; } bool operator < (const node &tmp) const { return shortest_path > tmp.shortest_path; } }; vector dijkstra() { vector visited(n + 5, false); vector dist(n + 5, 2e9); vector path(n + 5, -1); priority_queue pq; pq.push(node(1, 0)); while(!pq.empty()) { node current = pq.top(); pq.pop(); visited[current.idx] = true; if(current.idx == n) { break; } for(int i = 0; i < graph[current.idx].size(); i++) { int sosed = graph[current.idx][i].first; int pat = graph[current.idx][i].second; if(!visited[sosed] and current.shortest_path + pat < dist[sosed]) { dist[sosed] = current.shortest_path + pat; pq.push(node(sosed, current.shortest_path + pat)); path[sosed] = current.idx; } } } int A = 1, B = n; vector result; while(B != A) { result.push_back(B); B = path[B]; } result.push_back(A); return result; } int dijkstra_shortest_path() { vector visited(n + 5, false); vector dist(n + 5, 2e9); priority_queue pq; pq.push(node(1, 0)); while(!pq.empty()) { node current = pq.top(); pq.pop(); visited[current.idx] = true; if(current.idx == n) { return current.shortest_path; } for(int i = 0; i < graph[current.idx].size(); i++) { int sosed = graph[current.idx][i].first; int pat = graph[current.idx][i].second; if(!visited[sosed] and current.shortest_path + pat < dist[sosed]) { dist[sosed] = current.shortest_path + pat; pq.push(node(sosed, current.shortest_path + pat)); } } } return -2e9; } int main() { ios_base::sync_with_stdio(0); ifstream cin("rblock.in"); ofstream cout("rblock.out"); cin >> n >> m; for(int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; graph[a].push_back(make_pair(b, c)); graph[b].push_back(make_pair(a, c)); } vector path = dijkstra(); int initital_shortest = dijkstra_shortest_path(); int maximum = 0; for(int i = 0; i + 1 < path.size(); i++) { int idx1 = -1; for(int j = 0; j < graph[path[i]].size(); j++) { if(graph[path[i]][j].first == path[i + 1]) { graph[path[i]][j].second *= 2; idx1 = j; break; } } int idx2 = -1; for(int j = 0; j < graph[path[i + 1]].size(); j++) { if(graph[path[i + 1]][j].first == path[i]) { graph[path[i + 1]][j].second *= 2; idx2 = j; break; } } maximum = max(maximum, dijkstra_shortest_path()); graph[path[i]][idx1].second /= 2; graph[path[i + 1]][idx2].second /= 2; } cout << maximum - initital_shortest << endl; return 0; }