#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int n,m,s;
const int MAXV=100005;
const int INF=2147483647;
int d[MAXV];
bool vis[MAXV];
struct Node
{
int v;
int dis;
Node(int V,int Dis)
{
v=V;
dis=Dis;
}
friend bool operator<(Node n1,Node n2)
{
return n1.dis>n2.dis;
}
};
vector<Node> adj[MAXV];
priority_queue<Node> q;
void dijkstra()
{
d[s]=0;
vis[s]=true;
q.push(Node(s,0));
while(!q.empty())
{
int u=q.top().v;
q.pop();
vis[u]=true;
for(int j=0,int us=adj[u].size();j<us;j++)
{
int v=adj[u][j].v;
if(vis[v]==false&&d[u]+adj[u][j].dis<d[v])
{
d[v]=d[u]+adj[u][j].dis;
q.push(Node(v,d[v]));
}
}
}
}
int main()
{
int u,v,w;
scanf("%d%d%d",&n,&m,&s);
fill(d,d+MAXV,INF);
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
if(u==s) d[v]=min(d[v],w);
adj[u].push_back(Node(v,w));
}
dijkstra();
for(int i=1;i<=n;i++)
printf("%d ",d[i]);
return 0;
}