#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
int n,m,s,dis[MAXN];
struct Edge
{
int v,w;
};
struct Node
{
int u,dis;
bool operator <(const Node n1)const
{
return dis>n1.dis;
}
};
vector <Edge> g[MAXN];
void addEdge(int u,int v,int w)
{
g[u].push_back((Edge){v,w});
}
priority_queue <Node> q;
void dijkstra()
{
memset(dis,0x7f,sizeof(dis));
dis[s]=0;
q.push((Node){s,0});
while(!q.empty())
{
Node front=q.top();
int u=front.u;
q.pop();
if(dis[u]!=front.dis)continue;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].v;
if(dis[u]>dis[v]+g[u][i].w)
{
dis[u]=dis[v]+g[u][i].w;
q.push((Node){u,dis[u]});
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
addEdge(u,v,w);
}
dijkstra();
for(int i=1;i<=n;i++)cout<<dis[n]<<" ";
}