Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math"8 "sort"9)10 1112func CF1468M(_r io.Reader, _w io.Writer) {13 in := bufio.NewReader(_r)14 out := bufio.NewWriter(_w)15 defer out.Flush()16 17 var T, n, m, v int18o:19 for Fscan(in, &T); T > 0; T-- {20 Fscan(in, &n)21 nn := n22 a := make([][]int, n)23 vid := map[int]int{}24 for i := range a {25 Fscan(in, &m)26 a[i] = make([]int, m)27 for j := range a[i] {28 Fscan(in, &v)29 if vid[v] == 0 {30 vid[v] = n31 n++32 }33 a[i][j] = vid[v]34 }35 }36 g := make([][]int, n)37 deg := make([]int, n)38 for v, r := range a {39 for _, w := range r {40 g[v] = append(g[v], w)41 g[w] = append(g[w], v)42 deg[v]++43 deg[w]++44 }45 }46 less := func(v, w int) bool { return deg[v] < deg[w] || deg[v] == deg[w] && v < w }47 48 g2 := make([][]int, n)49 for v, ws := range g {50 for _, w := range ws {51 if less(v, w) {52 g2[v] = append(g2[v], w)53 }54 }55 }56 id := make([]int, n)57 for v, ws := range g {58 for _, w := range ws {59 for _, u := range g2[w] {60 if less(v, u) {61 if id[u] > 0 {62 if v < nn {63 Fprintln(out, v+1, u+1)64 } else {65 Fprintln(out, w+1, id[u])66 }67 continue o68 }69 id[u] = w + 170 }71 }72 }73 for _, w := range ws {74 for _, u := range g2[w] {75 if less(v, u) {76 id[u] = 077 }78 }79 }80 }81 Fprintln(out, -1)82 }83}84 8586func CF1468M2(_r io.Reader, _w io.Writer) {87 in := bufio.NewReader(_r)88 out := bufio.NewWriter(_w)89 defer out.Flush()90 type pair struct{ v, i int }91 92 var T, n, m, v int93o:94 for Fscan(in, &T); T > 0; T-- {95 Fscan(in, &n)96 a := make([][]int, n)97 vid := map[int]int{}98 for i := range a {99 Fscan(in, &m)100 a[i] = make([]int, m)101 for j := range a[i] {102 Fscan(in, &v)103 if _, has := vid[v]; !has {104 vid[v] = len(vid)105 }106 a[i][j] = vid[v]107 }108 }109 110 n = len(vid)111 sz := int(math.Round(math.Sqrt(float64(n)) / 3)) 112 113 has := make([]int, n)114 for i, b := range a {115 if len(b) < sz {116 continue117 }118 for _, v := range b {119 has[v] = i + 1120 }121 for j, c := range a {122 if j == i {123 continue124 }125 found := false126 for _, v := range c {127 if has[v] == i+1 {128 if found {129 Fprintln(out, i+1, j+1)130 continue o131 }132 found = true133 }134 }135 }136 }137 138 139 groups := make([][]pair, n)140 for i, b := range a {141 if len(b) < sz {142 sort.Ints(b)143 for j, v := range b {144 for _, w := range b[:j] {145 groups[v] = append(groups[v], pair{w, i + 1})146 }147 }148 }149 }150 id := make([]int, n)151 for _, g := range groups {152 for _, p := range g {153 if id[p.v] > 0 {154 Fprintln(out, id[p.v], p.i)155 continue o156 }157 id[p.v] = p.i158 }159 for _, p := range g {160 id[p.v] = 0161 }162 }163 Fprintln(out, -1)164 }165}166 167168