#include <bits/stdc++.h>
#define V 100005
#define INF 1000005

using namespace  std;

typedef pair<int, int> pii;
int n, m, s, q;
vector<pii> g[V];
vector<int> dist(V), cnt(V), p(V);

void dijkstra(int src) {
    dist.assign(V, INF);
    cnt.assign(V, 1);
    p.assign(V, 0);
    dist[src] = 0;
    set<pii> heap;
    heap.insert({dist[src], src});
    while (!heap.empty()) {
        int u = heap.begin() -> second;
        heap.erase(heap.begin());
        for (auto pp : g[u]) {
            int v = pp.first;
            int d = pp.second;
            if (dist[v] == dist[u] + d) cnt[v] += cnt[u];
            if (dist[v] > dist[u] + d) {
                if (dist[v] != INF) {
                    heap.erase(heap.find({dist[v], v}));
                }
                dist[v] = dist[u] + d;
                cnt[v] = cnt[u];
                p[v] = u;
                heap.insert({dist[v], v});
            }
        }
    }
}

int main(){
    cin >> n >> m;
    int x, y, z;
    for (int i = 1; i <= m; i++) {
        cin >> x >> y >> z;
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }
    cin >> s;
    dijkstra(s);
    for (int i = 1; i <= n; i++) {
        cout << dist[i] << " ";
    }
    return 0;
}
