Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 "container/heap"6 . "fmt"7 "io"8 "slices"9)10 1112func cf1253F(in io.Reader, _w io.Writer) {13 out := bufio.NewWriter(_w)14 defer out.Flush()15 var n, m, k, q int16 Fscan(in, &n, &m, &k, &q)17 type nb struct{ to, wt int }18 g := make([][]nb, n)19 type edge struct{ v, w, wt int }20 es := make([]edge, m)21 for i := range es {22 var v, w, wt int23 Fscan(in, &v, &w, &wt)24 v--25 w--26 g[v] = append(g[v], nb{w, wt})27 g[w] = append(g[w], nb{v, wt})28 es[i] = edge{v, w, wt}29 }30 31 dis := make([]int, n)32 for i := k; i < n; i++ {33 dis[i] = 1e1834 }35 h := make(hp53, k)36 for i := range h {37 h[i].v = i38 }39 for len(h) > 0 {40 p := heap.Pop(&h).(pair53)41 if p.d > dis[p.v] {42 continue43 }44 for _, e := range g[p.v] {45 w := e.to46 newD := p.d + e.wt47 if newD < dis[w] {48 dis[w] = newD49 heap.Push(&h, pair53{newD, w})50 }51 }52 }53 54 for i, e := range es {55 es[i].wt += dis[e.v] + dis[e.w]56 }57 slices.SortFunc(es, func(a, b edge) int { return a.wt - b.wt })58 59 type query struct{ to, i int }60 qs := make([][]query, n)61 for i := range q {62 var v, w int63 Fscan(in, &v, &w)64 v--65 w--66 qs[v] = append(qs[v], query{w, i})67 qs[w] = append(qs[w], query{v, i})68 }69 70 fa := make([]int, n)71 for i := range fa {72 fa[i] = i73 }74 find := func(x int) int {75 rt := x76 for fa[rt] != rt {77 rt = fa[rt]78 }79 for fa[x] != rt {80 fa[x], x = rt, fa[x]81 }82 return rt83 }84 85 ans := make([]int, q)86 for _, e := range es {87 v, w := find(e.v), find(e.w)88 if v == w {89 continue90 }91 if len(qs[v]) > len(qs[w]) {92 v, w = w, v93 }94 for _, q := range qs[v] {95 if ans[q.i] > 0 {96 continue97 }98 if find(q.to) == w {99 ans[q.i] = e.wt100 } else {101 qs[w] = append(qs[w], q)102 }103 }104 fa[v] = w105 }106 for _, v := range ans {107 Fprintln(out, v)108 }109}110 111112 113type pair53 struct{ d, v int }114type hp53 []pair53115func (h hp53) Len() int { return len(h) }116func (h hp53) Less(i, j int) bool { return h[i].d < h[j].d }117func (h hp53) Swap(i, j int) { h[i], h[j] = h[j], h[i] }118func (h *hp53) Push(v any) { *h = append(*h, v.(pair53)) }119func (h *hp53) Pop() (v any) { a := *h; *h, v = a[:len(a)-1], a[len(a)-1]; return }120