#include<iostream>
#include<vector>
#include<queue>
#include <climits>
using namespace std;
const int N=1e5+10;
long long dist[N];
typedef pair<int,int> PII;
vector<PII>graph[N];
priority_queue<PII,vector<PII>,greater<PII>>pq;
int n,m,s;
void dijkstra(){
for(int i=0;i<=n;++i)dist[i]=INT_MAX;
vector<bool>st(n,false);
dist[s]=0;
pq.push({0,s});
while(pq.size()){
auto e=pq.top();pq.pop();
int w=e.first,u=e.second;
if(st[u])continue;
st[u]=true;
for(auto &p:graph[u]){
int ww=p.second,v=p.first;
if(!st[v]&&dist[v]>dist[u]+ww){
dist[v]=dist[u]+ww;
pq.push({dist[v],v});
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=0;i<m;++i){
int u,v,w;cin>>u>>v>>w;
graph[u].push_back({v,w});
}
dijkstra();
for(int i=1;i<=n;++i)cout<<dist[i]<<" ";
return 0;
}