#include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
#define ti tu[i].to
#define N 100010
using namespace std;
struct node{
ll nex,to,w;
}tu[N];
ll head[N],n,m,s,tot,z[N],vis[N];
ll getMin()
{
ll Min = N;
for(ll i=1; i<=n; i++)
{
if(z[i]!=-1&&!vis[i])
{
if(z[i]<z[Min])Min = i;
}
}
return Min;
}
void Dijikstra(ll k)
{
ll Min;
if(!vis[k])
{
vis[k] = 1;
for(ll i=head[k]; i; i=tu[i].nex)
{
if(z[ti]==-1)z[ti] = z[k] + tu[i].w;
else z[ti] = min(z[ti],z[k]+tu[i].w);
}
Min = getMin();
if(Min!=N)Dijikstra(Min);
}
}
void add_edge(ll u,ll v,ll w)
{
tu[++tot].to = v;
tu[tot].nex = head[u];
tu[tot].w = w;
head[u] = tot;
}
int main()
{
cin >> n >> m >> s;
memset(z,-1,sizeof(z));
z[N] = 2147483647;
for(ll i=0; i<m; i++)
{
ll u,v,w;
cin >> u >> v >> w;
add_edge(u,v,w);
}
z[s] = 0;
Dijikstra(s);
for(ll i=1; i<=n; i++)
{
if(z[i]!=-1)cout << z[i] << " ";
else cout << 2147483647 << " ";
}
return 0;
}