#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100010,M=200010;
int n,m,k;
int head[N],cnt=1;
int lst[N],dis[N];
bool vis[N],ve[M];
int fa[N],nxt[N],res[N];
struct Edge{
int to,nxt,w;
}e[M<<1];
struct new_edge{
int w,u,v;
bool operator <(const new_edge &b) const{
return w<b.w;
}
}ne[M<<1];
void add(int u,int v,int w){
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int find(int x){
if(nxt[x]==x) return x;
return nxt[x]=find(nxt[x]);
}
priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void Dijkstra(){
memset(dis,0x3f,sizeof dis);
dis[1]=0;
q.push(make_pair(0,1));
int x,w;
while(!q.empty()){
x=q.top().second,w=q.top().first;
q.pop();
if(vis[x]) continue;
vis[x]=1;
ve[lst[x]]=1;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(dis[y]>w+e[i].w){
dis[y]=w+e[i].w;
lst[y]=i;
q.push(make_pair(dis[y],y));
}
}
}
}
void dfs(int x,int ff){
fa[x]=ff;
int y;
for(int i=head[x];i;i=e[i].nxt){
y=e[i].to;
if(y==ff || !ve[i]) continue;
dfs(y,x);
}
}
int main(){
cin>>n>>m;
int u,v,w;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
add(u,v,w);add(v,u,w);
}
Dijkstra();
dfs(1,0);
for(int i=1;i<=n;i++){
nxt[i]=i;res[i]=-1;
for(int j=head[i];j;j=e[j].nxt)
if(!ve[j] && !ve[j^1]){
ne[++k]=new_edge{e[j].w+dis[i]+dis[e[j].to],i,e[j].to};
ve[j]=1;
}
}
sort(ne+1,ne+1+k);
for(int i=1;i<=k;i++){
u=ne[i].u;v=ne[i].v;w=ne[i].w;
u=find(u);v=find(v);
while(u!=v){
if(dis[u]<dis[v])
swap(u,v);
res[u]=w-dis[u];
nxt[u]=fa[u];
u=find(u);
}
}
for(int i=2;i<=n;i++)
cout<<res[i]<<endl;
return 0;
}