#include <iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<math.h>
#define nmax 500073
const static int infinit=pow(2,30);
using namespace std;
typedef struct
{
int nod2;
int dis;
}pereche;
int viz[nmax], dist[nmax],start, finish,min1,nod_curent,n;
vector <pereche> v[nmax];
pair <int,int> hmin[3*nmax];
using namespace std;
void vecini(int nod1,int nod2, int dis)
{
pereche p;
p.nod2=nod2;
p.dis=dis;
v[nod1].push_back(p);
}
pair <int,int> el_min(int nod)
{
if (hmin[2*nod].second<hmin[2*nod+1].second) return hmin[2*nod];
else return hmin[2*nod+1];
}
void update(int nod, int left, int right,int pos, int el)
{
if (left==right)
{
hmin[nod].second=el;
hmin[nod].first=pos;
return;
}
int mid=(left+right)/2;
if (pos<=mid) update(2*nod,left,mid,pos,el);
else update(2*nod+1,mid+1,right,pos,el);
hmin[nod]=el_min(nod);
}
void distante(int a, int b, int c)
{
int distance=dist[a]+c;
if (dist[b]>distance) {
dist[b]=distance;
update(1,1,n,b,distance);
}
}
void parcurgere()
{
int nod;
update(1,1,n,1,0);
for (int j=1;j<=n;j++)
{
nod=hmin[1].first;
viz[nod]=1;
update(1,1,n,nod,infinit);
for (unsigned int i=0;i<v[nod].size();i++)
if (!viz[v[nod][i].nod2]) distante(nod,v[nod][i].nod2,v[nod][i].dis);
}
}
int main()
{
int a,b,c,m;
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
cin>>n>>m;
for (int i=1;i<=m;i++)
{
cin>>a>>b>>c;
vecini(a,b,c);
}
for (int i=2;i<=n;i++)
dist[i]=infinit;
fill(hmin,hmin+3*nmax,make_pair(0,infinit));
dist[1]=0;
parcurgere();
for (int i=2;i<=n;i++)
if (dist[i]==infinit) cout<<0<<" ";
else cout<<dist[i]<<" ";
return 0;
}