#include<iostream>
#include<queue>
using namespace std;
struct t{
int dis,u;
bool operator>(const t& a)const{return dis > a.dis;}
};
struct p{
int r,e;
};
bool b[200001];
vector<p>w[200001];
int n,x,y,tt,m,d[200001],s;
int main(){
priority_queue<t,vector<t>,greater<t>>mi;
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
cin>>x>>y>>tt;
w[x].push_back({y,tt});
w[y].push_back({x,tt});
}
for(int i=1;i<=n;i++)d[i]=1e9;
d[s]=0;
mi.push({0,s});
while(!mi.empty()){
int u=mi.top().u;
mi.pop();
if(b[u])continue;
b[u]=1;
int sum=w[u].size();
for(int i=0;i<sum;i++){
int uu=w[u][i].r;
if(d[u]+w[u][i].e<d[uu])
d[uu]=d[u]+w[u][i].e,mi.push({d[uu],uu});
}
}
for(int i=1;i<=n;i++)
cout<<d[i]<<" ";
}