#include #include #include #include #include int main() { int n, m; std::cin >> n >> m; std::vector> costs(n, std::vector(n, -1)); int a, b; long c; for (int i = 0; i < m; i++) { std::cin >> a >> b >> c; a--; b--; costs[a][b] = c; costs[b][a] = c; } std::vector d2(n, std::numeric_limits::max()); // NOT SKIPPED std::vector d3(n, std::numeric_limits::max()); // SKIPPED std::priority_queue> q2; d2[0] = 0; d3[0] = 0; q2.push(std::make_tuple(0, 0, false)); q2.push(std::make_tuple(0, 0, true)); while (!q2.empty()) { auto [_, u, skipped] = q2.top(); q2.pop(); if (skipped) { for (int v = 0; v < n; v++) { if (costs[u][v] == -1) { continue; } if (d3[u] + costs[u][v] < d3[v]) { d3[v] = d3[u] + costs[u][v]; q2.push(std::make_tuple(d3[v], v, true)); } } } else { for (int v = 0; v < n; v++) { if (costs[u][v] == -1) { continue; } if (d2[u] + costs[u][v] < d2[v]) { d2[v] = d2[u] + costs[u][v]; q2.push(std::make_tuple(d2[v], v, false)); } if (d2[u] < d3[v]) { d3[v] = d2[u]; q2.push(std::make_tuple(d3[v], v, true)); } } } } for (int i = 0; i < n; i++) { std::cout << d2[i] + d3[i] << std::endl; } }