const int MAXN=2e5+5;
int head[MAXN],edge_cnt;
struct Edge{
int to,next,w;
}edge[MAXN<<1];
void Insert(int u,int v,int w){
edge[++edge_cnt]=Edge{v,head[u],w};
head[u]=edge_cnt;
}
struct Node{
int u;
LL dis;
bool s1,s2;
Node(int u=0,LL dis=0,bool s1=0,bool s2=0):u(u),dis(dis),s1(s1),s2(s2){}
bool operator < (const Node &b)const{
return dis>b.dis;
}
};
LL dis[MAXN][2][2];
bool vis[MAXN][2][2];
int main()
{
int n=read_int(),m=read_int();
mem(dis,-1);
dis[1][0][0]=0;
while(m--){
int u=read_int(),v=read_int(),w=read_int();
Insert(u,v,w);
Insert(v,u,w);
}
priority_queue<Node>q;
q.push(Node(1,0,0,0));
while(!q.empty()){
Node t=q.top();q.pop();
if(vis[t.u][t.s1][t.s2])continue;
vis[t.u][t.s1][t.s2]=true;
for(int i=head[t.u];i;i=edge[i].next){
int v=edge[i].to;
_for(j,0,2)_for(k,0,2){
LL d=t.dis+edge[i].w;
bool s1=t.s1,s2=t.s2;
if(j==1&&!s1){
d-=edge[i].w;
s1=true;
}
if(k==1&&!s2){
d+=edge[i].w;
s2=true;
}
if(dis[v][s1][s2]==-1||dis[v][s1][s2]>d){
dis[v][s1][s2]=d;
q.push(Node(v,d,s1,s2));
}
}
}
}
_rep(i,2,n)
space(dis[i][1][1]);
return 0;
}