Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 "slices"9)10 1112func cf827D(in io.Reader, _w io.Writer) {13 out := bufio.NewWriter(_w)14 defer out.Flush()15 var n, m int16 Fscan(in, &n, &m)17 type edge struct{ v, w, wt, i int }18 es := make([]edge, m)19 for i := range es {20 Fscan(in, &es[i].v, &es[i].w, &es[i].wt)21 es[i].v--22 es[i].w--23 es[i].i = i24 }25 slices.SortFunc(es, func(a, b edge) int { return a.wt - b.wt })26 27 fa := make([]int, n)28 for i := range fa {29 fa[i] = i30 }31 find := func(x int) int {32 rt := x33 for fa[rt] != rt {34 rt = fa[rt]35 }36 for fa[x] != rt {37 fa[x], x = rt, fa[x]38 }39 return rt40 }41 42 type nb struct{ to, wt, i int }43 g := make([][]nb, n)44 for i, e := range es {45 v, w := e.v, e.w46 fv, fw := find(v), find(w)47 if fv != fw {48 fa[fv] = fw49 g[v] = append(g[v], nb{w, e.wt, e.i})50 g[w] = append(g[w], nb{v, e.wt, e.i})51 es[i].wt = -152 }53 }54 55 const mx = 1856 type pair struct{ p, maxWt int }57 pa := make([][mx]pair, n)58 paI := make([]int, n)59 dep := make([]int, n)60 var dfs func(int, int)61 dfs = func(v, p int) {62 pa[v][0].p = p63 for _, e := range g[v] {64 if w := e.to; w != p {65 pa[w][0].maxWt = e.wt66 paI[w] = e.i67 dep[w] = dep[v] + 168 dfs(w, v)69 }70 }71 }72 dfs(0, -1)73 for i := range mx - 1 {74 for v := range pa {75 if p := pa[v][i]; p.p != -1 {76 pp := pa[p.p][i]77 pa[v][i+1] = pair{pp.p, max(p.maxWt, pp.maxWt)}78 } else {79 pa[v][i+1].p = -180 }81 }82 }83 getLCA := func(v, w int) (lca, maxWt int) {84 if dep[v] > dep[w] {85 v, w = w, v86 }87 for k := dep[w] - dep[v]; k > 0; k &= k - 1 {88 p := pa[w][bits.TrailingZeros(uint(k))]89 maxWt = max(maxWt, p.maxWt)90 w = p.p91 }92 if w != v {93 for i := mx - 1; i >= 0; i-- {94 pv, pw := pa[v][i], pa[w][i]95 if pv.p != pw.p {96 maxWt = max(maxWt, pv.maxWt, pw.maxWt)97 v, w = pv.p, pw.p98 }99 }100 maxWt = max(maxWt, pa[v][0].maxWt, pa[w][0].maxWt)101 v = pa[v][0].p102 }103 lca = v104 return105 }106 107 ans := make([]int, m)108 for i := range ans {109 ans[i] = -1110 }111 for i := range fa {112 fa[i] = i113 }114 f := func(v, tar, wt int) {115 for v = find(v); v != tar; v = find(pa[v][0].p) {116 ans[paI[v]] = wt117 fa[v] = tar118 }119 }120 for _, e := range es {121 if e.wt < 0 {122 continue123 }124 v, w := e.v, e.w125 lca, maxWt := getLCA(v, w)126 ans[e.i] = maxWt - 1127 tar := find(lca)128 f(v, tar, e.wt-1)129 f(w, tar, e.wt-1)130 }131 for _, v := range ans {132 Fprint(out, v, " ")133 }134}135 136137