#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int maxv=100010;
const int INF=1000000000;
struct Node{
int v;
int w;
Node(int _v,int _w){
v=_v;
w=_w;
}
};
vector<Node> Adj[maxv];
bool vis[maxv]={false} ;
int d[maxv];
int n,m,s;
void Dijkstra(int s){
fill(d,d+maxv,INF);
d[s]=0;
for(int i=1;i<=n;i++){
int min=INF,u=-1;
for(int j=1;j<=n;j++){
if(d[j]<min && !vis[j]){
u=j;
min=d[j];
}
}
vis[u]=true;
for(int j=0;j<Adj[u].size();j++){
int v=Adj[u][j].v;
if(!vis[v] && d[u]+Adj[u][j].w<d[v]){
d[v]=d[u]+Adj[u][j].w;
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
Node node=Node(v,w);
Adj[u].push_back(node);
}
Dijkstra(s);
for(int i=1;i<=n;i++){
printf("%d ",d[i]);
}
return 0;
}