#include using namespace std; using ll=long long; using Pair=pair; const ll INF=1e18; ll N,M; //ダイクストラ法 //s:始点,G:参考にするグラフ,dist:距離を記録する配列 void dijkstra(ll s,vector> &G,vector> &dist){ priority_queue,greater> que; que.push({0,s}); while(!que.empty()){ ll to=que.top().second,cost=que.top().first; if(cost> N >> M; vector> G1(N),G2(M); for(int k=0;k> u >> v >> t; u--,v--; G1[u].push_back({v,t}); //そのまま G2[v].push_back({u,t}); //反転 } vector> dist1(N,vector(2,INF)),dist2(N,vector(2,INF)); dijkstra(N-2,G1,dist1); //dist1[k][0]:N-2からk dijkstra(N-2,G2,dist2); //dist2[k][0]:kからN-2 dijkstra(N-1,G1,dist1); //dist1[k][1]:N-1からk dijkstra(N-1,G2,dist2); //dist2[k][1]:kからN-1 for(int k=0;k