#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,head[200010],dis[200010],inf;
bool vis[200010];
struct node{
int to,nxt,val;
}edge[600010];
struct nodd{
int id,val;
bool operator<(const nodd &x)const{
return val<x.val;
}
};
priority_queue<nodd> q;
void add(int u,int v,int w){
edge[++cnt]=(node){v,head[u],w};
head[u]=cnt;
}
void dijkstra(){
memset(dis,0x3f3f3f3f,sizeof dis);
inf=dis[0];
dis[1]=0;
q.push((nodd){1,0});
while(!q.empty()){
int u=q.top().id;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].val){
dis[v]=dis[u]+edge[i].val;
if(!vis[v])q.push((nodd){v,dis[v]});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)add(i,i+n,0);
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v+n,u+n,w);
}
dijkstra();
for(int i=2;i<=n;i++)
if(dis[i+n]>=inf)cout<<-1<<" ";
else cout<<min(dis[i],dis[i+n])<<" ";
return 0;
}