#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,s;
struct way
{
int to;
int cost;
};
vector <way> map[10001];
typedef pair<long long,int> hanqihong;
priority_queue < hanqihong, vector<hanqihong> , greater<hanqihong> > q;
long long dis[10001];
bool vis[10001];
void dj()
{
for(int i=1;i<=n;i++)
dis[i]=2147483647;
dis[s]=0;
q.push(make_pair(dis[s],s));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(unsigned int i=0;i<map[u].size();i++)
{
int v=map[u][i].to;
if(dis[u]+map[u][i].cost<dis[v])
{
dis[v]=dis[u]+map[u][i].cost;
q.push(make_pair(dis[v],v));
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>s;
for(int i=0;i<m;i++)
{
int u;
way a;
cin>>u>>a.to>>a.cost;
map[u].push_back(a);
}
dj();
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}