Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6)7 89func cf294E(in io.Reader, out io.Writer) {10 var n int11 Fscan(in, &n)12 type nb struct{ to, wt, i int }13 g := make([][]nb, n)14 for i := range n - 1 {15 var v, w, wt int16 Fscan(in, &v, &w, &wt)17 v--18 w--19 g[v] = append(g[v], nb{w, wt, i})20 g[w] = append(g[w], nb{v, wt, i})21 }22 23 type tuple struct{ v, w, wt, i, sizeW int }24 es := make([]tuple, 0, n-1)25 var init func(int, int) int26 init = func(v, fa int) int {27 size := 128 for _, e := range g[v] {29 w := e.to30 if w != fa {31 sz := init(w, v)32 es = append(es, tuple{v, w, e.wt, e.i, sz})33 size += sz34 }35 }36 return size37 }38 init(0, -1)39 40 find := func(st, del, n int) (centroid int) {41 minOfMaxSubSize := int(1e9)42 var f func(int, int) int43 f = func(v, fa int) int {44 size := 145 maxSubSize := 046 for _, e := range g[v] {47 w := e.to48 if w != fa && e.i != del {49 sz := f(w, v)50 maxSubSize = max(maxSubSize, sz)51 size += sz52 }53 }54 maxSubSize = max(maxSubSize, n-size)55 if maxSubSize < minOfMaxSubSize {56 minOfMaxSubSize = maxSubSize57 centroid = v58 }59 return size60 }61 f(st, -1)62 return63 }64 65 ans := int(1e18)66 for _, e := range es {67 del := e.i68 v := find(e.v, del, n-e.sizeW)69 w := find(e.w, del, e.sizeW)70 g[v] = append(g[v], nb{w, e.wt, -1})71 g[w] = append(g[w], nb{v, e.wt, -1})72 res := 073 var dfs func(int, int) int74 dfs = func(v, fa int) int {75 size := 176 for _, e := range g[v] {77 w := e.to78 if w != fa && e.i != del {79 sz := dfs(w, v)80 res += sz * (n - sz) * e.wt81 size += sz82 }83 }84 return size85 }86 dfs(0, -1)87 ans = min(ans, res)88 g[v] = g[v][:len(g[v])-1]89 g[w] = g[w][:len(g[w])-1]90 }91 Fprint(out, ans)92}93 9495