#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005, MAXM = 1000005, MAXT = 1 << 18;
struct Edge {
  int to, val, next, id;
} edge[MAXM];
struct MST {
  int u, v, w, id;
} mst[MAXM];
int ppar[MAXN], head[MAXN], ist[MAXM], dep[MAXN], n, m, tot;
void addedge(int u, int v, int w, int id) {
  edge[++tot] = (Edge){v, w, head[u], id};
  head[u] = tot;
}
int find(int x) { return x == ppar[x] ? x : ppar[x] = find(ppar[x]); }
void merge(int x, int y) {
  x = find(x), y = find(y);
  if (x != y) ppar[x] = y;
}
int mmn[MAXT], beg[MAXN], ed[MAXN], ans[MAXM], par[20][MAXN], mx[20][MAXN],
    dcnt;
struct Que {
  int l, r, id;
};
struct Mod {
  int p, w;
};
vector<Que> qr1[MAXN], qr2[MAXN];
vector<Mod> md1[MAXN], md2[MAXN];
void dfs(int u, int fa) {
  beg[u] = ++dcnt;
  dep[u] = dep[fa] + 1;
  for (int i = head[u]; i; i = edge[i].next) {
    int v = edge[i].to;
    if (v == fa) continue;
    dfs(v, u);
    qr1[beg[v]].push_back((Que){beg[v], ed[v], edge[i].id});
    qr2[ed[v]].push_back((Que){beg[v], ed[v], edge[i].id});
    par[0][v] = u;
    mx[0][v] = edge[i].val;
  }
  ed[u] = dcnt;
}
void chk(int &x, int y) { x = x < y ? x : y; }
void cxk(int &x, int y) { x = x > y ? x : y; }
void upd(int x, int w, int l = 1, int r = n, int k = 1) {
  if (l == r) {
    chk(mmn[k], w);
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    upd(x, w, l, mid, k << 1);
  else
    upd(x, w, mid + 1, r, k << 1 | 1);
  chk(mmn[k], w);
}
int ask(int a, int b, int l = 1, int r = n, int k = 1) {
  if (a > r || b < l) return 1E9;
  if (a <= l && b >= r) return mmn[k];
  int mid = (l + r) >> 1;
  return min(ask(a, b, l, mid, k << 1), ask(a, b, mid + 1, r, k << 1 | 1));
}
int calc(int x, int y) {
  if (dep[x] > dep[y]) swap(x, y);
  int res = 0;
  for (int i = 19; ~i; i--)
    if (dep[par[i][y]] >= dep[x]) cxk(res, mx[i][y]), y = par[i][y];
  if (x == y) return res;
  for (int i = 19; ~i; i--)
    if (par[i][x] != par[i][y])
      cxk(res, mx[i][x]), cxk(res, mx[i][y]), x = par[i][x], y = par[i][y];
  return max(res, max(mx[0][x], mx[0][y]));
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    mst[i] = (MST){u, v, w, i};
    ans[i] = 1E9;
  }
  sort(mst + 1, mst + 1 + m,
       [&](const MST &a, const MST &b) { return a.w < b.w; });
  for (int i = 1; i <= n; i++) ppar[i] = i;
  for (int i = 1; i <= m; i++) {
    int u = mst[i].u, v = mst[i].v;
    if (find(u) != find(v)) {
      merge(u, v);
      ist[mst[i].id] = 1;
      addedge(u, v, mst[i].w, mst[i].id);
      addedge(v, u, mst[i].w, mst[i].id);
    }
  }
  for (int i = 0; i < MAXT; i++) mmn[i] = 1E9;
  dfs(1, 0);
  for (int i = 1; i < 20; i++)
    for (int j = 1; j <= n; j++) {
      par[i][j] = par[i - 1][par[i - 1][j]];
      mx[i][j] = max(mx[i - 1][j], mx[i - 1][par[i - 1][j]]);
    }
  for (int i = 1; i <= m; i++)
    if (!ist[mst[i].id]) {
      int u = mst[i].u, v = mst[i].v;
      if (beg[u] > beg[v]) swap(u, v);
      md1[beg[u]].push_back((Mod){beg[v], mst[i].w});
      md2[beg[v]].push_back((Mod){beg[u], mst[i].w});
      ans[mst[i].id] = calc(u, v);
    }
  for (int i = 1; i <= n; i++) {
    for (Que q : qr1[i]) chk(ans[q.id], ask(q.l, q.r));
    for (Mod d : md1[i]) upd(d.p, d.w);
  }
  for (int i = 0; i < MAXT; i++) mmn[i] = 1E9;
  for (int i = n; i > 0; i--) {
    for (Que q : qr2[i]) chk(ans[q.id], ask(q.l, q.r));
    for (Mod d : md2[i]) upd(d.p, d.w);
  }
  for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
  return 0;
}
