WA #2, 3, 9, 10
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
const int N=5e5+10,M=1e4+10;
int n,m,s;
bool v[M];
int dist[N];/*a[M][M]*/
struct Edge{
int u,v,w,next;
}a[M];
int head[N],tot,vis[N],dis[N];
struct node{
int w,now;
inline bool operator<(const node &x)const
{
return w>x.w;
}
};
priority_queue<node> q;
//前向星
void add(int u,int v,int w){
a[++tot].u=u;a[tot].v=v;a[tot].w=w;
a[tot].next=head[u];
head[u]=tot;
}
void dijkstra(){
for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
node x=q.top();q.pop();
int u=x.now; //堆顶,弹出(堆内最小的边)
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=a[i].next){
int v=a[i].v;
if(dis[v]>dis[u]+a[i].w){
dis[v]=dis[u]+a[i].w;
q.push((node){dis[v],v});
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
dijkstra();
for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
return 0;
}