#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f,M=2e5+1,N=1e5+1;
int dis[N];
bool flag[N];
inline int read()
{
int X=0,w=1;
char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
return X*w;
}
struct edge
{
int to;
int w;
int next;
}edge[M];
int head[N],cnt=0;
struct node
{
int index,dist;
bool operator < (const node &x)const
{
return dist>x.dist;
}
};
inline void add(int u,int v,int w)
{
edge[++cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
int main()
{
priority_queue<node>q;
int n,m,s;
int u,v,w;
n=read();m=read();s=read();
for(int i=1;i<=n;i++)
{
dis[i]=INF;
}
dis[s]=0;
for(int i=1;i<=m;i++)
{
u=read();v=read();w=read();
add(u,v,w);
}
q.push(node{s,0});
while(!q.empty())
{
node k=q.top();
int t=k.index;
q.pop();
flag[t]=true;
int minn=INF;
for(int i=head[t];i!=0;i=edge[i].next)
{
if(!flag[edge[i].to]&&edge[i].w+dis[t]<dis[edge[i].to])
{
dis[edge[i].to]=edge[i].w+dis[t];
q.push({edge[i].to,dis[edge[i].to]});
}
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
return 0;
}