#include <iostream>
#include <cstring>
#include <queue>
#define l first
#define r second
using namespace std;
const int N =1e5+10;
typedef pair<int,int> PII;
int n,m,tt;
int ne[N],e[N],h[N],idx,w[N];
bool st[N];
int dist[N];
void add(int a, int b ,int c)
{
e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx++;
}
void dijkstra()
{
memset(dist , 0x3f , sizeof dist);
dist[tt] = 0;
priority_queue<PII,vector<PII>,greater<PII>> q;
q.push({0,tt});
while( q.size() )
{
auto t = q.top();
q.pop();
int pos = t.r , distance = t.l ;
if(st[pos]) continue;
st[pos] = true;
for( int i = h[pos] ; i != -1 ; i = ne[i] )
{
int j = e[i];
if( dist[j] > dist[pos] + w[i] )
{
dist[j] = dist[pos] + w[i];
q.push({dist[j],j});
}
}
}
}
int main()
{
memset(h , -1 , sizeof h);
scanf("%d%d%d",&n,&m,&tt);
for( int i = 0 ; i < m ; i++ )
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
dijkstra();
for( int i = 1 ; i <= n ; i++ )
{
if( dist[i] == 0x3f3f3f3f ) printf("%d ",2147483647);
else printf("%d " , dist[i] );
}
return 0;
}