#include #include #include #include using namespace std; int main() { int n, m, C; cin >> n >> m >> C; vector>> g(n); for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; --u, --v; g[u].push_back({v, w}); g[v].push_back({u, w}); } vector> dis(2, vector (n, 1e18)); priority_queue>> pq; pq.push({0, {0, n - 1}}); while (!pq.empty()) { auto [c, pc] = pq.top(); pq.pop(); auto [cur, pos] = pc; c = -c; if (dis[cur][pos] <= c) continue; dis[cur][pos] = c; for (auto [to, w] : g[pos]) { if (dis[cur][to] > dis[cur][pos] + w + C) { pq.push({-dis[cur][pos] - w - C, {cur, to}}); } } if (cur == 0) { long long d = dis[0][pos] + C; if (dis[1][pos] > dis[0][pos]) { pq.push({-dis[0][pos], {1, pos}}); } for (auto [to, w] : g[pos]) { if (dis[1][to] > d) { pq.push({-d, {1, to}}); } } } } vector ans(n, 1e18); for (int i = 0; i < n; ++i) ans[i] = dis[1][i]; dis.assign(2, vector(n, 1e18)); pq.push({0, {0, 0}}); while (!pq.empty()) { auto [c, pc] = pq.top(); pq.pop(); auto [cur, pos] = pc; c = -c; if (dis[cur][pos] <= c) continue; dis[cur][pos] = c; for (auto [to, w] : g[pos]) { if (dis[cur][to] > dis[cur][pos] + w + C) { pq.push({-dis[cur][pos] - w - C, {cur, to}}); } } if (cur == 0) { long long d = dis[0][pos] + C; if (dis[1][pos] > dis[0][pos]) { pq.push({-dis[0][pos], {1, pos}}); } for (auto [to, w] : g[pos]) { if (dis[1][to] > d) { pq.push({-d, {1, to}}); } } } } long long tmp = dis[0][n - 1]; for (int i = 0; i < n; ++i) ans[i] += dis[0][i]; for (int i = 1; i < n; ++i) cout << min(ans[i], tmp) << "\n"; }