#include<iostream>
#include<algorithm>
#include<cassert>
using namespace std;
typedef long long ll;
const int N = 3e5 + 10;
const int INF = 0x7fffffff;
inline void gmin(int &a, int b) { a = min(a, b); }
inline void gmin(ll &a, ll b) { a = min(a, b); }
struct Node {
int v, w, next;
} pool[2 * N];
int ne, head[N];
inline void addEdge(int u, int v, int w) {
pool[++ne] = {v, w, head[u]};
head[u] = ne;
}
struct Edge2 {
int u, v, w;
} edg[N];
int n, m;
int fa1[N], mn[N]; ll ans[N];
bool mst[N], ok[2 * N], flag[N];
inline int find(int x) { if(fa1[x] == x) return x; return fa1[x] = find(fa1[x]); }
inline void merge(int x, int y) { fa1[find(x)] = find(y); }
int fa[N], fw[N], dep[N], dfn[N], id[N], sz[N], dt;
namespace SegT1 {
struct Node {
int tag1, tag2;
inline Node() : tag1(0), tag2(INF) {}
inline Node(int _t1, int _t2) : tag1(_t1), tag2(_t2) {}
} tr[4 * N];
inline int lc(int x) { return x << 1; }
inline int rc(int x) { return x << 1 | 1; }
inline void push_down(int p) {
if(tr[p].tag1) tr[lc(p)] = tr[rc(p)] = {1, INF};
if(tr[p].tag2 != INF) gmin(tr[lc(p)].tag2, tr[p].tag2), gmin(tr[rc(p)].tag2, tr[p].tag2);
tr[p] = {0, INF};
}
void ckmin(int p, int l, int r, int ql, int qr, int v) {
if(ql <= l && r <= qr) return gmin(tr[p].tag2, v);
int mid = (l + r) >> 1; push_down(p);
if(ql <= mid) ckmin(lc(p), l, mid, ql, qr, v);
if(mid < qr) ckmin(rc(p), mid + 1, r, ql, qr, v);
}
void clear(int p, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) return tr[p].tag1 = 1, tr[p].tag2 = INF, void();
int mid = (l + r) >> 1; push_down(p);
if(ql <= mid) clear(lc(p), l, mid, ql, qr);
if(mid < qr) clear(rc(p), mid + 1, r, ql, qr);
}
void print(int p, int l, int r) {
if(l == r) return gmin(ans[id[l]], tr[p].tag2), void();
int mid = (l + r) >> 1; push_down(p);
print(lc(p), l, mid); print(rc(p), mid + 1, r);
}
}
namespace SegT2 {
struct Node {
int tag1, tag2;
inline Node() : tag1(0), tag2(INF) {}
inline Node(int _t1, int _t2) : tag1(_t1), tag2(_t2) {}
} tr[4 * N];
inline int lc(int x) { return x << 1; }
inline int rc(int x) { return x << 1 | 1; }
inline void push_down(int p) {
if(tr[p].tag1) tr[lc(p)] = tr[rc(p)] = {1, INF};
if(tr[p].tag2 != INF) gmin(tr[lc(p)].tag2, tr[p].tag2), gmin(tr[rc(p)].tag2, tr[p].tag2);
tr[p] = {0, INF};
}
void ckmin(int p, int l, int r, int ql, int qr, int v) {
if(ql <= l && r <= qr) return gmin(tr[p].tag2, v);
int mid = (l + r) >> 1; push_down(p);
if(ql <= mid) ckmin(lc(p), l, mid, ql, qr, v);
if(mid < qr) ckmin(rc(p), mid + 1, r, ql, qr, v);
}
void clear(int p, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) return tr[p].tag1 = 1, tr[p].tag2 = INF, void();
int mid = (l + r) >> 1; push_down(p);
if(ql <= mid) clear(lc(p), l, mid, ql, qr);
if(mid < qr) clear(rc(p), mid + 1, r, ql, qr);
}
int query(int p, int l, int r, int q) {
if(l == r) return tr[p].tag2;
int mid = (l + r) >> 1; push_down(p);
if(q <= mid) return query(lc(p), l, mid, q);
return query(rc(p), mid + 1, r, q);
}
}
void dfs1(int u) {
dfn[u] = ++dt; id[dt] = u;
sz[u] = 1; dep[u] = dep[fa[u]] + 1;
for(int e = head[u]; e; e = pool[e].next) {
int v = pool[e].v, w = pool[e].w;
if(v == fa[u]) continue;
fa[v] = u; fw[v] = w;
dfs1(v);
sz[u] += sz[v];
}
}
void dfs2(int u, int pre, int mx) {
pre = min(pre, mn[find(u)]);
SegT2::ckmin(1, 1, n, dfn[u], dfn[u], pre);
ans[u] = min(ans[u], (ll)pre + mx);
for(int e = head[u]; e; e = pool[e].next) {
int v = pool[e].v, w = pool[e].w;
if(v == fa[u] || !ok[e]) continue;
dfs2(v, min(pre, w), mx);
}
}
int main() {
freopen("alley.in", "r", stdin);
freopen("alley.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; i++) cin >> edg[i].u >> edg[i].v >> edg[i].w;
sort(edg + 1, edg + 1 + m, [](Edge2 a, Edge2 b){ return a.w < b.w; });
for(int i = 1; i <= n; i++) fa1[i] = i, ans[i] = mn[i] = INF;
for(int i = 1; i <= m; i++) {
int u = edg[i].u, v = edg[i].v, w = edg[i].w;
if(find(u) == find(v)) continue;
addEdge(u, v, w);
addEdge(v, u, w);
merge(u, v); mst[i] = 1;
if(find(u) == find(1)) flag[i] = 1;
}
dfs1(1);
for(int i = 1; i <= n; i++) fa1[i] = i;
for(int i = 1, cnt = 0; i <= m; i++) {
int u = edg[i].u, v = edg[i].v, w = edg[i].w;
if(mst[i]) {
++cnt; ok[2 * cnt - 1] = ok[2 * cnt] = 1;
if(!flag[i]) continue;
if(dep[u] > dep[v]) swap(u, v);
SegT1::clear(1, 1, n, dfn[v], dfn[v] + sz[v] - 1);
SegT2::clear(1, 1, n, dfn[v], dfn[v] + sz[v] - 1);
int tmp = min(SegT2::query(1, 1, n, dfn[u]), w);
dfs2(v, tmp, w);
} else {
int tmp = INF;
while(u != v) {
if(dep[u] < dep[v]) swap(u, v);
tmp = min(tmp, min(mn[find(u)], fw[u]));
merge(u, fa[u]);
u = find(u);
}
mn[u] = min(mn[u], tmp);
assert(find(u) == u);
SegT1::ckmin(1, 1, n, dfn[u], dfn[u] + sz[u] - 1, w + mn[u]);
SegT2::ckmin(1, 1, n, dfn[u], dfn[u] + sz[u] - 1, mn[u]);
}
}
SegT1::print(1, 1, n);
for(int i = 2; i <= n; i++) cout << ans[i] << '\n';
return 0;
}