#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=1e5+5;
const int M=2e5+5;
int n,m;
int p[N],rk[N];
struct edge{
int v;
long long w;
};
struct node{
int id;
long long len;
bool operator < (const node &a) const{
return len > a.len;
}
};
vector<edge> h[N];
long long d[N];
bool f[N];
priority_queue<node> q;
int pre[N];
void pnt(int x){
if(pre[x]){
pnt(pre[x]);
}
printf("%d ",x);
}
int s;
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int u2,v2;
long long w2;
scanf("%d%d%lld",&u2,&v2,&w2);
h[u2].push_back(edge{v2,w2});
h[v2].push_back(edge{u2,w2});
}
d[s]=0;
for(int i=1;i<=n;i++){
if(i == s) continue;
d[i]=100000000000000000;
}
q.push(node{s,0});
while(!q.empty()){
int u=q.top().id;
q.pop();
if(f[u]) continue;
f[u]=1;
for(int i=0;i<h[u].size();i++){
int v2=h[u][i].v;
long long w2=h[u][i].w;
if(d[u]+w2 < d[v2]){
d[v2]=d[u]+w2;
q.push(node{v2,d[v2]});
}
}
}
for(int i=1;i<=n;i++){
printf("%lld ",d[i]);
}
return 0;
}