#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=1000010;
int n,m,s,idx;
int d[N],head[N],ver[M],Next[M],edge[M];
bool st[N];
priority_queue<pair<int,int> > q;
void add(int a,int b,int w)
{
ver[++idx]=b;edge[idx]=w;Next[idx]=head[a];head[a]=idx;
}
void dijkstra()
{
memset(d,0x3f,sizeof(d));
memset(st,0,sizeof(st));
d[s]=0;
q.push(make_pair(0,1));
while(q.size())
{
int x=q.top().second;
q.pop();
if(st[x]) continue;
st[x]=1;
for(int i=head[x];i;i=Next[i])
{
int y=ver[i],z=edge[i];
if(d[y]>d[x]+z)
{
d[y]=d[x]+z;
q.push(make_pair(-d[y],y));
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=0;i<m;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
}
dijkstra();
for(int i=1;i<=n;i++)
{
if(d[i] == 0x3f3f3f3f) printf("2147483647 ");
else printf("%d ",d[i]);
}
return 0;
}