#include <bits/stdc++.h>
using namespace std;
int n,m,s;
int dis[10005];
vector<int>a[10005];
int dise[10005][10005];
bool vis[10005];
struct node{
int dis;
int bh;
bool operator <( const node &x )const
{
return x.dis < dis;
}
};
void dij(){
int st=s;
priority_queue<node>q;
q.push((node){0,s});
while(!q.empty()){
node r=q.top();
q.pop();
if (vis[r.bh]) continue;
vis[r.bh]=1;
for(int i=0;i<a[r.bh].size();i++){
if(!vis[a[r.bh][i]]) {
if (dis[a[r.bh][i]]>dise[r.bh][a[r.bh][i]]+r.dis){
dis[a[r.bh][i]]=dise[r.bh][a[r.bh][i]]+r.dis;
q.push( ( node ){dis[a[r.bh][i]],a[r.bh][i]} );
}
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++) dis[i]=2147483647;
memset(dise,0,sizeof(dise));
for(int i=1;i<=m;i++){
int u,v;
int s1;
scanf("%d%d%lld",&u,&v,&s1);
if (dise[u][v]!=0) dise[u][v]=min(dise[u][v],s1),dise[v][u]=dise[u][v];
else{
a[u].push_back(v);
a[v].push_back(u);
dise[u][v]=dise[v][u]=s1;
}
}
dis[s]=0;
dij();
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
return 0;
}