#include #include #include using namespace std; using ll = long long; #include template< typename T > struct edge{ int from,to; T cost; edge(int from,int to, T cost):from(from),to(to),cost(cost){}; edge &operator=(const int& x){ to = x; return *this; } }; template< typename T > struct graph{ int n; vector>> e; graph(int n):n(n),e(n){} void addedge(int from,int to,T cost){ e[from].emplace_back(from,to,cost); } vector> &operator[](int i) { return e[i]; } }; /* * O(ElogV) * 到達不能の場合は―1が入ってる。 */ template< typename T > vector dijkstra(graph& g, int st){ int n = g.n; using pt = pair; vector dist(n,-1); dist[st] = 0; priority_queue, greater>que; que.emplace(0,st); while(que.size()){ int ni; T cost; cost = que.top().first; ni = que.top().second; que.pop(); if(dist[ni] itr:g[ni]){ int nxt = itr.to; if(dist[nxt]>cost+itr.cost||dist[nxt]==-1){ dist[nxt] = cost + itr.cost; que.emplace(dist[nxt],nxt); } } } return dist; }; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n,m; cin>>n>>m; graph g(n),gg(n); for(int i = 0;i>u>>v>>t; u--;v--; g.addedge(u,v,t); gg.addedge(v,u,t); } auto d1 = dijkstra(g,n-2); auto d2 = dijkstra(g,n-1); auto d3 = dijkstra(gg,n-2); auto d4 = dijkstra(gg,n-1); for(int i = 0;i