#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;

int n,m;
struct edge{
	int v,w,nxt;
};
edge e[maxn];
int head[maxn];
int cnt=0,s;
int dis[maxn];
struct node{
	int id,dis;
	bool operator <(const node &a)const{
		return dis>a.dis;
	}
};
void add(int from,int to,int w){//链式向前星
	e[++cnt].v=to;
	e[cnt].w=w;
	e[cnt].nxt=head[from];
	head[from]=cnt;
}

void dijkstra(int s){//bfs
	for(int i=1;i<=n;i++)dis[i]=2147483647;
	priority_queue<node>st;
	dis[s]=0;
	st.push((node){s,0});
	while(!st.empty()){
		node f=st.top();st.pop();
		int u=f.id;int d=f.dis;
		if(d!=dis[u])continue; 
		for(int i=head[u];i;i=e[i].nxt){
			if(dis[e[i].v]>d+e[i].w){
				dis[e[i].v]=d+e[i].w;
				st.push((node){e[i].v,dis[e[i].v]});
			}
		}
	}
	for(int i=1;i<=n;i++)
	cout<<dis[i]<<" ";
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	int x,y,z;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
	dijkstra(s);
} 

链式向前星模拟: