#include<bits/stdc++.h>
using namespace std;
const long long Inf = 0x3f3f3f3f3f3f3f3f;
const long long Max = (1 << 31) - 1;
long long n, m, s;
vector<pair<long long, int> >g[10009];
long long dis[10009];
long long h[10009];
void d() {
priority_queue<pair<long long,int>, vector<pair<long long,int>>, greater<pair<long long,int>> >que;
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
que.push({dis[s], s});
while (que.size()) {
int pos = que.top().second;
que.pop();
if (h[pos])continue;
h[pos] = 1;
for (int i = 0; i < g[pos].size(); ++i) {
int v = g[pos][i].first;
int w = g[pos][i].second;
if (dis[v] > dis[pos] + w) {
dis[v] = dis[pos] + w;
que.push({dis[v], v});
}
}
}
}
int main() {
cin >> n >> m >> s;
for (long long i = 1; i <= m; ++i) {
long long u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
d();
for (long long i = 1; i <= n; ++i) {
printf("%d ", dis[i] == Inf ? Max : dis[i]);
}