#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 50050
#define INF 1 << 30
int C[NMAX], H[NMAX], poz[NMAX], n, m, N;
vector < pair <int, int> > G[NMAX];
void read ();
void up_heap (int);
void down_heap (int);
void delete_heap (int);
void dijkstra_heap ();
void print_sol ();
int main () {
freopen ("dijkstra.in", "r", stdin);
freopen ("dijkstra.out", "w", stdout);
read ();
dijkstra_heap ();
print_sol ();
return 0;
}
void read () {
int i, x, y, c;
scanf ("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &c);
G[x].push_back (make_pair (y, c));
}
}
void up_heap (int k) {
int t, c, aux;
t = k >> 1, c = k;
while (t > 0 && C[H[c]] < C[H[t]]) {
aux = H[c], H[c] = H[t], H[t] = aux;
poz[H[c]] = c, poz[H[t]] = t;
c = t, t = c >> 1;
}
}
void down_heap (int k) {
int t, c, aux;
t = k, c = k << 1;
if (c < N && C[H[c+1]] < C[H[c]]) c++;
while (c <= N && C[H[t]] > C[H[c]]) {
aux = H[c], H[c] = H[t], H[t] = aux;
poz[H[c]] = c, poz[H[t]] = t;
t = c, c = t << 1;
if (c < N && C[H[c+1]] < C[H[c]]) c++;
}
}
void delete_heap (int k) {
H[k] = H[N], poz[H[k]] = k;
N--;
down_heap (k);
}
void dijkstra_heap () {
int nod, fiu, cost, i;
for (i = 2; i <= n; i++)
C[i] = INF;
N++;
H[1] = 1, poz[H[1]] = 1, C[1] = 0;
while (N) {
nod = H[1];
delete_heap (1);
for (i = 0; i < (int) G[nod].size(); i++) {
fiu = G[nod][i].first, cost = G[nod][i].second;
if (C[nod] + cost < C[fiu]) {
C[fiu] = C[nod] + cost;
if (!poz[fiu]) {
N++, H[N] = fiu, poz[fiu] = N;
up_heap (N);
}
else
up_heap (poz[fiu]);
}
}
}
}
void print_sol () {
int i;
for (i = 2; i <= n; i++)
printf ("%d ", C[i] != INF ? C[i] : 0);
}