Use this to learn the idea, then write your own version.
1class Solution:2 3 def minimumWeight(4 self,5 edges: list[list[int]],6 queries: list[list[int]]7 ) -> list[int]:8 n = len(edges) + 19 m = math.ceil(math.log2(n))10 graph = [[] for _ in range(n)]11 jump = [[0] * m for _ in range(n)] 12 depth = [0] * n 13 dist = [0] * n 14 15 for u, v, w in edges:16 graph[u].append((v, w))17 graph[v].append((u, w))18 19 self._dfs(graph, 0, -1, jump, depth, dist)20 21 for j in range(1, m):22 for i in range(n):23 jump[i][j] = jump[jump[i][j - 1]][j - 1]24 25 return [(self._distance(src1, src2, jump, depth, dist) +26 self._distance(src1, dest, jump, depth, dist) +27 self._distance(src2, dest, jump, depth, dist)) 228 for src1, src2, dest in queries]29 30 def _dfs(31 self,32 graph: list[list[tuple[int, int]]],33 u: int,34 prev: int,35 jump: list[list[int]],36 depth: list[int],37 dist: list[int]38 ) -> None:39 for v, w in graph[u]:40 if v == prev:41 continue42 jump[v][0] = u43 depth[v] = depth[u] + 144 dist[v] = dist[u] + w45 self._dfs(graph, v, u, jump, depth, dist)46 47 def _getLCA(48 self,49 u: int,50 v: int,51 jump: list[list[int]],52 depth: list[int]53 ) -> int:54 """Returns the lca(u, v) by binary jump."""55 56 if depth[u] > depth[v]:57 return self._getLCA(v, u, jump, depth)58 59 for j in range(len(jump[0])):60 if depth[v] - depth[u] >> j & 1:61 v = jump[v][j]62 if u == v:63 return u64 65 for j in range(len(jump[0]) - 1, -1, -1):66 if jump[u][j] != jump[v][j]:67 u = jump[u][j]68 v = jump[v][j]69 return jump[u][0]70 71 def _distance(72 self,73 u: int,74 v: int,75 jump: list[list[int]],76 depth: list[int],77 dist: list[int]78 ) -> int:79 """Returns the distance between u and v."""80 lca = self._getLCA(u, v, jump, depth)81 return dist[u] + dist[v] - 2 * dist[lca]82