#include <bits/stdc++.h>   using namespace std;   const int INF = 1000000007;   int n, m;   int fa[200010];   struct Line {     int u, v, c;   } l[200010];   int p[200010];   bool cmp(int x, int y) { return l[x].c < l[y].c; }   bool intree[200010];   struct Edge {     int v, id, nxt;   } e[400010];   int tot;   int first[200010];   void build(int u, int v, int id) {     e[++tot] = (Edge){v, id, first[u]};     first[u] = tot;     return;   }   int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }   bool merge(int u, int v) {     u = find(u);     v = find(v);     if (u == v) return false;     fa[u] = v;     return true;   }   void init() {     for (int i = 1; i <= n; i++) fa[i] = i;     for (int i = 1; i <= m; i++) p[i] = i;     sort(p + 1, p + m + 1, cmp);     for (int i = 1; i <= m; i++) {       int x = p[i];       if (merge(l[x].u, l[x].v)) {         intree[x] = true;         build(l[x].u, l[x].v, x);         build(l[x].v, l[x].u, x);       }     }     return;   }   const int M = 20;   int f[200010][20];   int g[200010][20];   int h[200010][20];   int dep[200010];   int Id[200010];   void dfs(int u, int lst, int lste) {     Id[u] = lste;     dep[u] = dep[lst] + 1;     f[u][0] = lst;     g[u][0] = l[lste].c;     h[u][0] = INF;     for (int i = 1; i < M; i++) {       f[u][i] = f[f[u][i - 1]][i - 1];       g[u][i] = max(g[u][i - 1], g[f[u][i - 1]][i - 1]);       h[u][i] = INF;     }     for (int i = first[u]; i; i = e[i].nxt)       if (e[i].v != lst) dfs(e[i].v, u, e[i].id);     return;   }   int ans[200010];   void solve(int x) {     int u = l[x].u;     int v = l[x].v;     int c = l[x].c;     ans[x] = 0;     if (dep[u] < dep[v]) swap(u, v);     int need = dep[u] - dep[v], cur = 0;     while (need) {       if (need & 1) {         ans[x] = max(ans[x], g[u][cur]);         h[u][cur] = min(h[u][cur], c);         u = f[u][cur];       }       need >>= 1;       cur++;     }     if (u == v) return;     for (int i = M - 1; i >= 0; i--)       if (f[u][i] != f[v][i]) {         ans[x] = max(ans[x], g[u][i]);         ans[x] = max(ans[x], g[v][i]);         h[u][i] = min(h[u][i], c);         h[v][i] = min(h[v][i], c);         u = f[u][i];         v = f[v][i];       }     ans[x] = max(ans[x], g[u][0]);     ans[x] = max(ans[x], g[v][0]);     h[u][0] = min(h[u][0], c);     h[v][0] = min(h[v][0], c);     return;   }   int main() {     scanf( %d %d , &n, &m);     for (int i = 1; i <= m; i++) scanf( %d %d %d , &l[i].u, &l[i].v, &l[i].c);     init();     dfs(1, 0, 0);     for (int i = 1; i <= m; i++)       if (!intree[i]) solve(i);     for (int i = M - 1; i > 0; i--)       for (int u = 1; u <= n; u++) {         h[u][i - 1] = min(h[u][i - 1], h[u][i]);         h[f[u][i - 1]][i - 1] = min(h[f[u][i - 1]][i - 1], h[u][i]);       }     for (int u = 2; u <= n; u++) ans[Id[u]] = h[u][0];     for (int i = 1; i <= m; i++)       if (ans[i] != INF)         printf( %d  , ans[i] - 1);       else         printf( -1  );     printf(  n );     return 0;   }   