Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "sort"8)9 1011func CF733F(_r io.Reader, _w io.Writer) {12 in := bufio.NewReader(_r)13 out := bufio.NewWriter(_w)14 defer out.Flush()15 16 var n, m, money int17 Fscan(in, &n, &m)18 es := make([]struct{ v, w, wt, c, i int }, m)19 for i := range es {20 Fscan(in, &es[i].wt)21 es[i].i = i22 }23 for i := range es {24 Fscan(in, &es[i].c)25 }26 for i := range es {27 Fscan(in, &es[i].v, &es[i].w)28 es[i].v--29 es[i].w--30 }31 Fscan(in, &money)32 sort.Slice(es, func(i, j int) bool { return es[i].wt < es[j].wt })33 34 fa := make([]int, n)35 for i := range fa {36 fa[i] = i37 }38 var find func(int) int39 find = func(x int) int {40 if fa[x] != x {41 fa[x] = find(fa[x])42 }43 return fa[x]44 }45 s := int64(0)46 type nb struct{ to, wt, eid int }47 g := make([][]nb, n)48 for i, e := range es {49 v, w, wt, eid := e.v, e.w, e.wt, e.i50 if fv, fw := find(v), find(w); fv != fw {51 s += int64(wt)52 fa[fv] = fw53 g[v] = append(g[v], nb{w, wt, eid})54 g[w] = append(g[w], nb{v, wt, eid})55 es[i].wt = -es[i].wt56 }57 }58 59 const mx = 1860 type pair struct{ p, max, eid int }61 pa := make([][mx]pair, n)62 dep := make([]int, n)63 var f func(v, p, d int)64 f = func(v, p, d int) {65 pa[v][0].p = p66 dep[v] = d67 for _, e := range g[v] {68 if w := e.to; w != p {69 pa[w][0].max = e.wt70 pa[w][0].eid = e.eid71 f(w, v, d+1)72 }73 }74 }75 f(0, -1, 0)76 for i := 0; i+1 < mx; i++ {77 for v := range pa {78 if p := pa[v][i]; p.p != -1 {79 pp := pa[p.p][i]80 pa[v][i+1].p = pp.p81 if p.max > pp.max {82 pa[v][i+1].max = p.max83 pa[v][i+1].eid = p.eid84 } else {85 pa[v][i+1].max = pp.max86 pa[v][i+1].eid = pp.eid87 }88 } else {89 pa[v][i+1].p = -190 }91 }92 }93 maxWt := func(v, w int) (mxWt, eid int) {94 if dep[v] > dep[w] {95 v, w = w, v96 }97 for i := 0; i < mx; i++ {98 if (dep[w]-dep[v])>>i&1 > 0 {99 p := pa[w][i]100 w = p.p101 if p.max > mxWt {102 mxWt, eid = p.max, p.eid103 }104 }105 }106 if v == w {107 return108 }109 for i := mx - 1; i >= 0; i-- {110 if p, q := pa[v][i], pa[w][i]; p.p != q.p {111 v, w = p.p, q.p112 if p.max > mxWt {113 mxWt, eid = p.max, p.eid114 }115 if q.max > mxWt {116 mxWt, eid = q.max, q.eid117 }118 }119 }120 if p := pa[v][0]; p.max > mxWt {121 mxWt, eid = p.max, p.eid122 }123 if p := pa[w][0]; p.max > mxWt {124 mxWt, eid = p.max, p.eid125 }126 return127 }128 129 mxDec, ori, cur := -1, -1, 0130 for _, e := range es {131 dec := money / e.c132 if e.wt > 0 {133 mxWt, eid := maxWt(e.v, e.w)134 dec = mxWt - (e.wt - dec)135 if dec > mxDec {136 mxDec, ori, cur = dec, eid, e.i137 }138 } else {139 if dec > mxDec {140 mxDec, ori, cur = dec, -1, e.i141 }142 }143 }144 Fprintln(out, s-int64(mxDec))145 for _, e := range es {146 if e.i == ori || e.i != cur && e.wt > 0 {147 continue148 }149 wt := e.wt150 if wt < 0 {151 wt = -wt152 }153 if e.i == cur {154 wt -= money / e.c155 }156 Fprintln(out, e.i+1, wt)157 }158}159 160161