rt。
#include<bits/stdc++.h>
using namespace std;
struct edge{
int u,v,w,nxt,pos;
}e[500005];
struct node{
int dis,pos,flag=0,lpos;
bool operator <(const node &x)const{
return x.dis<dis;
}
};
int head[100005],cnt;
long long dis[100005];
bool vis[100005];
int n,m,s;
int k,t;
void add(int u,int v,int w,int o){
e[++cnt].u=u;
e[cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
e[cnt].pos=o;
head[u]=cnt;
}
priority_queue<node>q;
long long read() {
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
node p;
void dj(){
p.dis=0;
p.pos=1;
p.flag=0;
q.push(p);
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,y=tmp.dis;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
if(!tmp.flag&&e[i].pos==1)continue;
if(tmp.flag&&e[i].pos==0)continue;
if(tmp.lpos!=e[i].pos&&x!=1)p.flag=1;
else p.flag=0;
if(dis[v]>dis[x]+e[i].w){
dis[v]=dis[x]+e[i].w;
if(!vis[v]){
p.dis=dis[v];
p.pos=v;
p.lpos=tmp.pos;
q.push(p);
}
}
}
}
}
int u[200005],v[200005],w[200005];
int main(){
n=read();
m=read();
for(int i=1;i<=m;i++){
u[i]=read();
v[i]=read();
w[i]=read();
add(u[i],v[i],w[i],0);
add(v[i],u[i],w[i],1);
}
for(int i=1;i<=n;i++)dis[i]=1145141919810;
dis[1]=0;
dj();
cnt=1;
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++){
add(u[i],v[i],w[i],1);
add(v[i],u[i],w[i],0);
}
dj();
for(t=2;t<=n;t++){
if(dis[t]!=1145141919810)printf("%lld ",dis[t]);
else printf("-1 ");
}
return 0;
}