#include <bits/stdc++.h>
using namespace std;
#define RE register
#define maxn 10005
priority_queue<pair<int,int> >q;
struct Edge
{
int u,v,w,next;
}edge[500005];
int head[maxn],cnt,n,m,s,u,vi,v[maxn],d[maxn],w;
inline void add(int u,int v,int w){
edge[++cnt].u=u;
edge[cnt].w=w;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline dij(){
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
d[s]=0;
q.push(make_pair(0,s));
while(q.size()){
int x=q.top().second;
q.pop();
if(v[x])continue;
v[x]=1;
for(RE int i=head[x];i;i=edge[i].next){
int v=edge[i].v;
if(d[v]>d[x]+edge[i].w){
d[v]=d[x]+edge[i].w;
q.push(make_pair(-d[v],v));
}
}
}
}
inline void fread(int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
int main(){
fread(n);
fread(m);
fread(s);
for(RE int i=1;i<=m;i++){
fread(u);
fread(vi);
fread(w);
add(u,vi,w);
}
for(RE int i=1;i<=n;i++)printf("%d ",d[i]);
return 0;
}