#include<bits/stdc++.h>
using namespace std;
const int N = 100000;
struct zzz {
int to;
int val;
int nex;
}e[N];
int top, head[N];
void add(int x,int y,int z) {
e[++top].to = y;
e[top].val = z;
e[top].nex = head[x];
head[x] = top;
}
int vis[N];
int dist[N];
struct cmp {
bool operator()(int x, int y) {
return dist[x] < dist[y];
}
};
priority_queue<int, vector<int>, cmp> qe;
int main() {
int n, m, s;
scanf("%d%d%d", &n, &m, &s);
for (int i = 1;i <= m; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
memset(dist, 127, sizeof(dist));
dist[s] = 0;
qe.push(s);
while (!qe.empty()) {
int a = qe.top();
vis[a] = 1;
qe.pop();
for (int i = head[a];i;i = e[i].nex) {
if (vis[e[i].to] == 0) {
dist[e[i].to] = min(dist[e[i].to], dist[a] + e[i].val);
qe.push(e[i].to);
}
}
}
for (int i = 1;i <= n;i++) {
printf("%d ", dist[i]);
}
return 0;
}