#include <iostream>
#include <queue>
#define NMAX 100001
#define inf 10000000
using namespace std;
typedef pair <int,int> iPair;
vector < vector < iPair > > la;
int n,m;
void citire()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%d %d",&n,&m);
la.resize(n+1);
for(int i=1; i<=m; ++i)
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
la[x].push_back(make_pair(y,c));
}
}
void dijsktra()
{
priority_queue < iPair, vector <iPair>, greater <iPair> >pq;
bool used[50005] = {0};
int dist[50005];
for(int i=1; i<=n; ++i)
dist[i] = inf;
dist[1] = 0;
pq.push(make_pair(0,1)); // dist si nod
while(!pq.empty())
{
int v = pq.top().second;
int dv = pq.top().first;
pq.pop();
// if(used[v] == 1)
// continue;
// used[v] = 1;
vector <iPair>::iterator it;
for(it = la[v].begin(); it!=la[v].end(); ++it)
{
int vecin = (*it).first;
int dvecin = (*it).second;
if(dist[vecin] > dv + dvecin)
{
dist[vecin] = dv + dvecin;
pq.push(make_pair(dist[vecin], vecin));
}
}
}
for(int i=2; i<=n; ++i)
if(dist[i] == inf)
printf("0 ");
else
printf("%d ",dist[i]);
}
int main()
{
citire();
dijsktra();
}