Cod sursa(job #209600)
#include <stdio.h>
#include <bitset>
#include <queue>
#include <algorithm>
#define nMax 50005
#define INF 2147000000
using namespace std;
long n,m,i,nod;
long a,b,c,g[nMax];
long d[nMax];
bitset <nMax> iq;
queue <int> Q;
int *v[nMax],*cost[nMax];
int main(){
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%ld %ld\n",&n,&m);
for (i=1;i<=m;++i){scanf("%ld %ld %ld\n",&a,&b,&c); g[a]++; }
for (i=1;i<=n;++i){ v[i]=(int *) malloc(g[i]*sizeof(int));}
for (i=1;i<=n;++i){ cost[i]=(int *) malloc(g[i]*sizeof(int)); g[i]=0;}
fseek(stdin, 0, SEEK_SET); scanf("%ld %ld\n",&n,&m);
for (i=1;i<=m;++i){
scanf("%ld %ld %ld\n",&a,&b,&c);
v[a][g[a]]=b;
cost[a][g[a]]=c;
g[a]++;
}
///////////////////
for (i=2;i<=n;++i)d[i]=INF;d[1]=0;
while(!Q.empty())Q.pop();
Q.push(1);iq[1]=1;
while (!Q.empty()){
nod=Q.front(); Q.pop();
iq[nod]=0;
for (i=0;i<g[nod];++i)
if (d[nod]+cost[nod][i] < d[v[nod][i]]){
d[v[nod][i]]=d[nod]+cost[nod][i];
if (!iq[v[nod][i]]){
Q.push(v[nod][i]);
iq[v[nod][i]]=1;
}
}
}
/////////////////////
for (i=2;i<=n;++i)
if (d[i]!=INF)printf("%ld ",d[i]);
else printf("0 ");
return 0;
}