#include using namespace std; using i64 = long long; struct edge { i64 to; i64 cost; }; vector dijkstra(const vector>& g,int s) { vector dist(g.size(), 1e18); dist[s] = 0; using P = pair; priority_queue,greater

> que; que.push({dist[s], s}); while(!que.empty()) { int v = que.top().second; i64 d = que.top().first; que.pop(); if(dist[v] < d) continue; for(auto e : g[v]) { if(dist[e.to] > dist[v] + e.cost) { dist[e.to] = dist[v] + e.cost; que.push({dist[e.to], e.to}); } } } return dist; } int main() { int N,M; cin >> N >> M; vector> g(N); vector> gg(N * 2); for(int i = 0;i < M;i++) { i64 a,b,c; cin >> a >> b >> c; a--; b--; g[a].push_back({b, c}); g[b].push_back({a, c}); gg[a].push_back({b, c}); gg[b].push_back({a, c}); gg[a + N].push_back({b + N, c}); gg[b + N].push_back({a + N, c}); gg[a].push_back({b + N, 0}); gg[b].push_back({a + N, 0}); } gg[0].push_back({N, 0}); auto res = dijkstra(g, 0); auto res2 = dijkstra(gg, 0); for(int i = 0;i < N;i++) { cout << res[i] + res2[i + N] << endl; } }