#include<cstdio>
#include<queue>
#include<vector>
#include<cctype>
#include<cstring>
#define N 100010
#define rint register int
#define inf 2147483647
using namespace std;
struct edge{
int num,val;
bool operator <(const edge &x) const{
return val>x.val;
}
};
priority_queue<edge> q;
vector <pair<int,int > >e[N];
int n,m,s,dis[N];
bool vis[N];
inline int read()
{
int f=0,x=0;
char ch=getchar();
while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
inline void dij(int s){
while(!q.empty()){
int u=q.top().num;
q.pop();
if(!vis[u]){
vis[u]=true;
for(rint i=0;i<e[u].size();++i){
int v=e[u][i].first;
if(!vis[v]&&dis[v]>dis[u]+e[u][i].second){
dis[v]=dis[u]+e[u][i].second;
q.push((edge){v,dis[v]});
}
}
}
}
}
int main(){
n=read();m=read();s=read();
for(rint i=1;i<=m;++i){
int u,v,w;
u=read();v=read();w=read();
if(u==v) continue;
e[u].push_back(make_pair(v,w));
}
for(rint i=1;i<=n;++i) dis[i]=inf;
dis[s]=0;
q.push((edge){s,0});
dij(s);
for(rint i=1;i<=n;++i) printf("%d ",dis[i]);
return 0;
}