#include <bits/stdc++.h>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
const int oo = 1<<30;
struct _arc
{
int cost, destinatie;
} arc;
struct nod
{
vector<_arc> v;
} v[50001];
struct cmp
{ inline bool operator()(_arc a1,_arc a2) {return (a1.cost>a2.cost);}
};
vector<_arc> h;
bool viz[50001];
int sol[50001];
int main()
{
int n, m, a, b, c;
in>>n>>m;
for(int i=2; i<=n; i++) sol[i] = oo;
for(int i=1; i<=m; i++)
{
in>>a>>b>>c;
arc.destinatie = b;
arc.cost = c;
v[a].v.push_back(arc);
}
sol[1] = 0;
for(unsigned int i=0; i< v[1].v.size(); i++)
{
h.push_back(v[1].v[i]);
sol[v[1].v[i].destinatie] = v[1].v[i].cost;
}
make_heap(h.begin(), h.end(), cmp());
viz[1] = true;
while(!h.empty())
{
arc = h.front();
pop_heap(h.begin(), h.end(), cmp());
h.pop_back();
if(arc.cost <= sol[arc.destinatie])
sol[arc.destinatie] = arc.cost;
if(!viz[arc.destinatie]){
viz[arc.destinatie] = true;
for(uint32_t i=0; i< v[arc.destinatie].v.size(); i++)
{
if(!viz[v[arc.destinatie].v[i].destinatie])
{
v[arc.destinatie].v[i].cost += arc.cost;
h.push_back(v[arc.destinatie].v[i]);
push_heap(h.begin(), h.end(), cmp());
}
}}
}
for(int i=2; i<=n; i++)
if(sol[i] == oo)
out<<0<<' ';
else out<<sol[i]<<' ';
return 0;
}