#include<bits/stdc++.h>
using namespace std;
const long long inf=2147483647;
int n,m,k,sy;
struct edge{
int from;
int to;
int next;
int len;
}a[200002];
struct node{
int u,v,w;
}e[200002];
bool cmp(node x,node y){
if(x.u==y.u and x.v==y.v) return x.w<y.w;
else if(x.u==y.u) return x.v<y.v;
else return x.u<y.u;
}
int pre[200002];
int s=1,t;
int f[200002];
long long dis[200002];
void add(int u,int v,int l){
k++;
a[k].from=u;
a[k].to=v;
a[k].len=l;
a[k].next=pre[u];
pre[u]=k;
}
queue<int> q;
void spfa(){
for(int i=1;i<=n;i++){
dis[i]=pow(2,31)-1;
f[i]=false;
}
dis[sy]=0;
q.push(sy);
f[sy]=true;
while(!q.empty()){
int h=q.front();
q.pop();
f[h]=false;
for(int i=pre[h];i!=0;i=a[i].next){
int to=a[i].to;
if(dis[to]>dis[h]+a[i].len){
dis[to]=dis[h]+a[i].len;
if(!f[to]){
q.push(to);
f[to]=true;
}
}
}
}
}
int main(){
cin>>n>>m>>sy;
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
if(u==e[i-1].u and v==e[i-1].v) continue;
add(u,v,w);
}
spfa();
for(int i=1;i<=n;i++){
if(i==sy) cout<<0<<" ";
else cout<<dis[i]<<" ";
}
}