#include <fstream>
#include <vector>
#include <climits>
#include <algorithm>
#include <set>
#define NMAX 50005
#define INF INT_MAX
using namespace std;
int n,m,d[NMAX];
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
set< pair<int,int> > coada;
vector<int> G[NMAX],C[NMAX];
vector<int> answer;
void citire(){
f>>n>>m;
int i,x,y,z;
for(i=1;i<=m;i++){
f>>x>>y>>z;
G[x].push_back(y);
C[x].push_back(z);
}
}
void dijkstra(){
vector< pair <int,int> >::iterator it;
int i;
d[1]=0;
for(i=0;i<G[1].size();i++){
d[G[1][i]]=C[1][i];
coada.insert(make_pair(d[G[1][i]],G[1][i]));
}
for(i=2;i<=n;i++)
if(d[i]==0)
d[i]=INF;
while(!coada.empty()){
int val=coada.begin()->first;
int x=coada.begin()->second;
coada.erase(coada.begin());
for(i=0;i<G[x].size();i++){
if(d[G[x][i]]>val+C[x][i]){
d[G[x][i]]=val+C[x][i];
coada.insert(make_pair(d[G[x][i]],G[x][i]));
}
}
}
for(i=2;i<=n;i++)
if(d[i]==INF)
g<<0<<' ';
else
g<<d[i]<<' ';
}
int main(){
citire();
dijkstra();
return 0;
}