#include<bits/stdc++.h>
#define int long long
#define rr read()
using namespace std;
inline int read(){
int x=0,f=1; char c=getchar_unlocked();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar_unlocked();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar_unlocked();
}
return x*f;
}
void write(int i){
if(i<0) putchar_unlocked('-'),i=-i ;
if(i>9) write(i/10) ;
putchar_unlocked((i%10)|0x30) ;
return ;
}
struct edge{
int ver,nxt;
int edge;
}a[1000001];
int head[1000001],tot;
int d[1000001];
bool v[1000001];
int n=rr,m=rr,s=rr;;
priority_queue<pair<int,int> > q;
void add(int x,int y,int z){
a[++tot].nxt=head[tot];
head[x]=tot;
a[tot].ver=y;
a[tot].edge=z;
}
void dijkstra(){
for(int i=0;i<=n;i++) d[i]=2147483647;
d[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(v[x]) continue;
v[x]=1;
for(int i=head[x];i;i=a[i].nxt){
if(d[a[i].ver]>d[x]+a[i].edge){
d[a[i].ver]=d[x]+a[i].edge;
if(!v[a[i].ver]){
q.push(make_pair(d[a[i].ver],a[i].ver));
}
}
}
}
return ;
}
signed main(){
for(int i=1;i<=m;i++){
add(rr,rr,rr);
}
dijkstra();
for(int i=1;i<=n;i++){
write(d[i]);
putchar(' ');
}
return 0;
}