Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func CF160D(_r io.Reader, _w io.Writer) {11 in := bufio.NewReader(_r)12 out := bufio.NewWriter(_w)13 defer out.Flush()14 min := func(a, b int) int {15 if a < b {16 return a17 }18 return b19 }20 21 var n, m, v, w, wi, c int22 Fscan(in, &n, &m)23 fa := make([]int, n+1)24 for i := range fa {25 fa[i] = i26 }27 var find func(int) int28 find = func(x int) int {29 if fa[x] != x {30 fa[x] = find(fa[x])31 }32 return fa[x]33 }34 type edge struct{ v, w, i int }35 edges := [1e6 + 1][]edge{}36 for i := 0; i < m; i++ {37 Fscan(in, &v, &w, &wi)38 edges[wi] = append(edges[wi], edge{v, w, i})39 }40 ans := make([]int8, m)41 42 type nb struct{ to, eid int }43 g := make([][]nb, n+1)44 dfn := make([]int, n+1)45 var f func(v, fid int) int46 f = func(v, fid int) int {47 c++48 dfn[v] = c49 lowV := c50 for _, e := range g[v] {51 if w := e.to; dfn[w] == 0 {52 lowW := f(w, e.eid)53 if lowW > dfn[v] {54 ans[e.eid] = 155 }56 lowV = min(lowV, lowW)57 } else if e.eid != fid {58 lowV = min(lowV, dfn[w])59 }60 }61 return lowV62 }63 for _, es := range edges {64 if es == nil {65 continue66 }67 vs := []int{}68 for _, e := range es {69 if v, w, i := find(e.v), find(e.w), e.i; v != w {70 g[v] = append(g[v], nb{w, i})71 g[w] = append(g[w], nb{v, i})72 vs = append(vs, v, w)73 } else {74 ans[i] = 275 }76 }77 for _, v := range vs {78 if dfn[v] == 0 {79 f(v, -1)80 }81 }82 for i := 0; i < len(vs); i += 2 {83 v, w := vs[i], vs[i+1]84 fa[find(v)] = find(w)85 g[v] = nil86 g[w] = nil87 dfn[v] = 088 dfn[w] = 089 }90 }91 92 s := [3]string{"at least one", "any", "none"}93 for _, t := range ans {94 Fprintln(out, s[t])95 }96}97 9899