#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct Edge{
int to,next,w;
}edge[2*N];
int n,m,s,head[N],cnt,vis[N];
long long dis[N];
inline void add(int u,int v,int w){
cnt++;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void dijkstra(){
priority_queue<pair<long long,int> > q;
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int u=q.top().first,w=q.top().second;
vis[q.top().second]=1;q.pop();
for(int i=head[s];~i;i=edge[i].next){
if(dis[edge[i].to]>dis[u]+edge[i].w){
dis[edge[i].to]=dis[u]+edge[i].w;
if(!vis[edge[i].to]){
q.push(make_pair(-dis[edge[i].to],edge[i].to));
}
}
}
}
}
int main(){
memset(head,-1,sizeof(head));
memset(dis,-0x7fffffff,sizeof(dis));
cin>>n>>m>>s;
for(int u,v,w,i=1;i<=m;i++){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dijkstra();
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
return 0;
}