#include<bits/stdc++.h>
using namespace std;
struct node
{
int to,quan;
bool operator <(const node& x) const
{
return quan>x.quan;
}
};
vector<node>t[150005];
int dist[150005],mp[150005];
priority_queue<node>que;
void dij(int s)
{
dist[s]=0;
que.push((node){s,dist[s]});
while(!que.empty())
{
node dq=que.top();
que.pop();
for(int i=0;i<t[dq.to].size();i++)
{
node dq2=t[dq.to][i];
if(dist[dq2.to]>dq.quan+dq2.quan)
{
dist[dq2.to]=dq.quan+dq2.quan;
que.push((node){dq2.to,dist[dq2.to]});
}
}
}
}
int main()
{
int n,m,kai;
cin>>n>>m>>kai;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
t[x].push_back((node){y,z});
}
memset(dist,0x7f,sizeof(dist));
dij(kai);
for(int i=1;i<=n;i++)
{
cout<<dist[i]<<" ";
}
}