#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct edge{
int to;
int power;
int next;
}e[500001];
int head[10001], st, n, m, dis[10001], cnt, vis[10001];
struct cmp{
bool operator () (int a, int b)
{
return dis[a] < dis[b];
}
};
void add(int u, int v, int w)
{
e[++cnt].to = v;
e[cnt].power = w;
e[cnt].next = head[u];
head[u] = cnt;
}
priority_queue <int, vector<int>, cmp> q;
int minn = 999999999, minpos;
int main()
{
cin >> n >> m >> st;
memset(head, -1, sizeof(head));
for(int i = 1; i <= n; i++)
if(i == st)
dis[i] = 0;
else
dis[i] = 999999999;
for(int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
if(u == st)
{
dis[v] = min(dis[v], w);
if(dis[v] < minn)
{
minn = dis[v];
minpos = v;
}
}
}
q.push(minpos);
while(!q.empty())
{
int now = q.top();
q.pop();
for(int i = head[now]; i != -1; i = e[i].next)
{
if(e[i].power + dis[now] < dis[e[i].to])
{
dis[e[i].to] = dis[now] + e[i].power;
q.push(e[i].to);
}
}
}
for(int i = 1; i <= n; i++)
if(dis[i] == 9999999999)
cout << 2147483647 << ' ';
else
cout << dis[i] << ' ';
return 0;
}