#include <cstdio>
#include <cstring>
#include <queue>
#define min(a,b) a<b?a:b
using namespace std;
int n, m, s;
int dis[100005];
bool vis[100005];
struct egde {int nxt, y, w;}e[500005];
int ltp, lk[500005];
void ist(int x, int y, int w) {
e[++ltp] = (egde) {lk[x], y, w}; lk[x] = ltp;
// e[++ltp] = (egde) {lk[y], x, w}; lk[y] = ltp;
}
void dij() {
priority_queue < pair < int, int > > q;
memset(dis, 0x3f, sizeof (dis));
dis[s] = 0;
q.push(make_pair(0, s));
while (!q.empty()) {
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = lk[u]; i; i = e[i].nxt) {
int y = e[i].y;
int w = e[i].w;
if (dis[y] > dis[u] + w) {
dis[y] = dis[u] + w;
q.push(make_pair(dis[y], y));
}
}
}
}
void inp() {
int x, y, w;
scanf("%d%d%d", &n, &m, &s);
for (int i = 1; i <= m; ++ i) {
scanf("%d%d%d", &x, &y, &w);
ist(x, y, w);
}
}
void print_1() {
for (int i = 1; i <= n; ++ i) {
if (dis[i] == 0x3f3f3f3f) printf("2147483647 ");
else printf("%d ", dis[i]);
}
}
int main() {
inp();
dij();
print_1();
return 0;
}