Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func cf911F(_r io.Reader, _w io.Writer) {11 in := bufio.NewReader(_r)12 out := bufio.NewWriter(_w)13 defer out.Flush()14 15 var n, u int16 Fscan(in, &n)17 g := make([][]int, n)18 deg := make([]int, n)19 for i := 1; i < n; i++ {20 var v, w int21 Fscan(in, &v, &w)22 v--23 w--24 g[v] = append(g[v], w)25 g[w] = append(g[w], v)26 deg[v]++27 deg[w]++28 }29 30 maxD := -131 var dfs func(int, int, int)32 dfs = func(v, fa, d int) {33 if d > maxD {34 maxD, u = d, v35 }36 for _, w := range g[v] {37 if w != fa {38 dfs(w, v, d+1)39 }40 }41 }42 dfs(0, -1, 0)43 dv := u44 maxD = -145 dfs(u, -1, 0)46 dw := u47 ans := maxD * (maxD + 1) / 248 49 f := make([]struct{ v, d int }, n)50 for i := range f {51 f[i].d = -152 }53 var findFarthest func(int, int, int, int)54 findFarthest = func(v, fa, d, tar int) {55 if d > f[v].d {56 f[v].d = d57 f[v].v = tar58 }59 for _, w := range g[v] {60 if w != fa {61 findFarthest(w, v, d+1, tar)62 }63 }64 }65 findFarthest(dv, -1, 0, dv)66 findFarthest(dw, -1, 0, dw)67 68 op := [][3]int{}69 q := []int{}70 for i, d := range deg {71 if d == 1 && i != dv && i != dw {72 q = append(q, i)73 }74 }75 for len(q) > 0 {76 v := q[0]77 q = q[1:]78 p := &f[v]79 ans += p.d80 p.d = -181 op = append(op, [3]int{v, p.v, v})82 for _, w := range g[v] {83 if deg[w]--; deg[w] == 1 {84 q = append(q, w)85 }86 }87 }88 89 for v := dv; v != dw; {90 f[v].d = -191 op = append(op, [3]int{v, dw, v})92 for _, w := range g[v] {93 if f[w].d >= 0 {94 v = w95 break96 }97 }98 }99 Fprintln(out, ans)100 for _, p := range op {101 Fprintln(out, p[0]+1, p[1]+1, p[2]+1)102 }103}104 105106