#include<bits/stdc++.h>
using namespace std;
const int N=100009;
const int M=200009;
const int INF=1e9+1;
int n,m,s;
int d[N],ok[N];
vector<int> to[N],w[N];
struct node
{
int dst,num;
bool operator < (const node &a)const
{
return a.dst<dst;
}
};
priority_queue<node> q;
void Dijkstra()
{
fill(d+1,d+n+2,INF);
fill(ok+1,ok+n+2,0);
d[s]=0;
q.push((node){0,s});
while(!q.empty())
{
node tmp=q.top();
q.pop();
int u=tmp.num;
if(ok[u]) continue;
ok[u]=1;
for(int i=0;i<to[u].size();i++)
{
int v=to[u][i];
int cost=w[u][i];
if(d[v]>d[u]+cost)
{
d[v]=d[u]+cost;
if(!ok[v]) q.push((node){d[v],v});
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int u,v,t;
cin>>u>>v>>t;
to[u].push_back(v);
to[v].push_back(u);
w[u].push_back(t);
w[v].push_back(t);
}
Dijkstra();
for(int i=1;i<=n;i++) cout<<d[i]<<" ";
return 0;
}