#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<queue>
using namespace std;
const int N=10005,M=500005,INF=2147483647;
int n,m,s,Cnt,dis[N],vis[N],head[M];
struct Edge{
int u,v,w,Next;
}Edge[M];
void Push(int u,int v,int w){
Edge[++Cnt].Next=head[u];
Edge[Cnt].v=v;
Edge[Cnt].w=w;
head[u]=Cnt;
}
void SPFA(){
queue<int> q;
for(int i=1; i<=n; i++){
dis[i]=INF;
vis[i]=0;
}
q.push(s);
dis[s]=0;
vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=Edge[i].Next){
int v=Edge[i].v;
if(dis[v]>dis[u]+Edge[i].w){
dis[v]=dis[u]+Edge[i].w;
if(vis[v]==0){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
int u,v,w;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
Push(u,v,w);
}
SPFA();
for(int i=1;i<=n;i++)
if(s==i){
cout<<0<<" ";
}
else{
cout<<dis[i]<<" ";
}
return 0;
}