#include <cstdio>
#include <vector>
#define f first
#define s second
#define fs (mid << 1)
#define fd ((mid << 1) + 1)
#define mp make_pair
const int MAXARBINT = 1 << 17;
const int maxn = 50010;
const int INF = 0x3f3f3f3f;
using namespace std;
vector <pair <int, int> > graph[maxn];
int n, d[maxn];
pair <int, int> aint[MAXARBINT];
void build_tree(int node, int lf, int rt) {
if(lf == rt) {
aint[node] = mp(INF, lf);
return ;
}
int mid = (lf + rt) >> 1;
build_tree(fs, lf, mid);
build_tree(fd, mid + 1, rt);
aint[node] = min(aint[fs], aint[fd]);
}
void update(int node, int lf , int rt, int pos, int val) {
if(lf == rt) {
aint[node] = mp(val, pos);
return ;
}
int mid = (lf + rt) >> 1;
if(pos <= mid) update(fs, lf, mid, pos, val);
if(pos > mid) update( fd, mid + 1, rt, pos, val);
aint[node] = min(aint[fs], aint[fd]);
}
void dijkstra(int node) {
for(int i = 1; i <= n; ++i)
d[i] = INF;
d[node] = 0;
build_tree(1, 1, n);
update(1, 1, n, node, 0);
for(int i = 1; i <= n; ++i) {
node = aint[1].s;
update(1, 1, n, node, INF);
//printf("%d\n", node);
for(vector <pair <int, int> > :: iterator it = graph[node].begin(); it != graph[node].end(); ++it)
if(d[it -> f] > d[node] + it -> s) {
d[it -> f] = d[node] + it -> s;
update(1, 1, n, it -> f, d[it -> f]);
}
}
for(int i = 2; i <= n; ++i) {
if(d[i] == INF) printf("0 ");
else printf("%d ", d[i]);
}
printf("\n");
}
int main() {
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
int m, x, y, c;
for( scanf("%d %d\n", &n, &m); m--; ) {
scanf("%d %d %d", &x, &y, &c);
graph[x].push_back(make_pair(y, c));
}
for(int i = 1; i <= n; ++i)
graph[i].resize(graph[i].size() + 1);
dijkstra(1);
return 0;
}