#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);
}
链式向前星模拟: