#include<bits/stdc++.h>
using namespace std;
#define maxn 110
#define inf 0x3f3f3f3f
int n,m;
struct edge
{
int u,v,w;
edge(int uu=0,int vv=0,int ww=0)
{
u=uu;
v=vv;
w=ww;
}
};
struct node
{
int d,u;
node(int dd=0,int uu=0)
{
d=dd;
u=uu;
}
friend bool operator <(const node&a,const node&b)
{
if(a.d==b.d)
return a.u>b.u;
return a.d>b.d;
}
};
priority_queue<struct node>q;
vector<struct edge>e;
vector<int>g[maxn];
bool vis[maxn];
int dis[maxn];
void init()
{
for(int i=0;i<n;i++)
g[i].clear();
e.clear();
}
void addedge(int u,int v,int w)
{
int len=e.size();
for(int i=0;i<len;i++)//去重操作
{
if(e[i].u==u&&e[i].v==v)
{
if(e[i].w>w)
e[i].w=e[i^1].w=w;
return ;
}
}
e.push_back(edge(u,v,w));
g[u].push_back(len);
e.push_back(edge(v,u,w));
g[v].push_back(len+1);
}
void dijkstra()
{
struct edge ed;
for(int i=0;i<n;i++)
dis[i]=inf;
dis[0]=0;
memset(vis,0,sizeof(vis));
q.push(node(dis[0],0));
while(!q.empty())
{
node x=q.top();
int u=x.u;
vis[u]=1;
q.pop();
for(int i=0;i<g[u].size();i++)
{
ed=e[g[u][i]];
if(!vis[ed.v]&&dis[ed.v]>(dis[u]+ed.w))
{
dis[ed.v]=dis[u]+ed.w;
q.push(node(dis[ed.v],ed.v));
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
init();
for(int i=0;i<m;i++)
{
int u,v,d;
scanf("%d %d %d",&u,&v,&d);
addedge(u,v,d);
}
// for(int i=0;i<e.size();i++)
//cout<<i<<" th "<<" st:"<<e[i].u<<" ed:"<<e[i].v<<" weight:"<<e[i].w<<endl;
dijkstra();
for(int i=0;i<n;i++)
cout<<dis[i]<<" ";
cout<<endl;
}
return 0;
}