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