#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef uint64_t ull; typedef pair P; typedef pair Pid; typedef pair Pdi; typedef pair Pl; typedef pair Pll; typedef pair> PP; typedef pair PPi; constexpr double PI = 3.1415926535897932; // acos(-1) constexpr double EPS = 1e-9; constexpr int INF = 1001001001; constexpr int mod = 1000000007; // constexpr int mod = 998244353; #define chmax(x, y) x = max(x, y) #define chmin(x, y) x = min(x, y) #define chadd(x, y) x = (x + y) % mod struct Edge{ int to, cost; Edge() = default; Edge(int to, int cost) : to(to), cost(cost) {} }; struct Info{ ll dist; int longest, v; Info() = default; Info(ll d, int l, int v) : dist(d), longest(l), v(v) {} bool operator<(const Info& info) const{ if(dist == info.dist){ return longest > info.longest; } return dist < info.dist; } bool operator>(const Info& info) const{ return !((*this) < info); } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector> graph(n); vector dist(n, 1e+17), dist2(n, 1e+17); for(int i = 0; i < m; ++i){ int a, b, c; cin >> a >> b >> c; --a, --b; graph[a].emplace_back(Edge(b, c)); graph[b].emplace_back(Edge(a, c)); } priority_queue, greater> que; dist[0] = 0; que.push(Pl(0, 0)); while(!que.empty()){ Pl p = que.top(); que.pop(); ll d = p.first; int from = p.second; if(d > dist[from]) continue; for(Edge e : graph[from]){ int to = e.to, cost = e.cost; if(dist[to] > d + cost){ dist[to] = d + cost; que.push(Pl(dist[to], to)); } } } priority_queue, greater> que2; dist2[0] = 0; que2.push(Info(0, 0, 0)); while(!que2.empty()){ Info p = que2.top(); que2.pop(); ll d = p.dist; int longest = p.longest, from = p.v; if(d > dist2[from]) continue; for(Edge e : graph[from]){ int to = e.to, cost = e.cost; if(longest >= cost){ if(dist2[to] > d + cost){ dist2[to] = d + cost; que2.push(Info(dist2[to], longest, to)); } } else{ if(dist2[to] > d + longest){ dist2[to] = d + longest; que2.push(Info(dist2[to], cost, to)); } } } } for(int i = 0; i < n; ++i) cout << dist[i] + dist2[i] << "\n"; }