import sys input = sys.stdin.readline N=int(input()) EDGE=[list(map(int,input().split())) for i in range(N-1)] EDGELIST=[[] for i in range(N)] for x,y,l in EDGE: EDGELIST[x].append((y,l)) EDGELIST[y].append((x,l)) # LCA(オイラーツアー+Segment tree) DEPTH=[-1]*N DEPTH[0]=0 from collections import deque QUE = deque([0]) QUE2 = deque() EULER=[]# (i,j)で,(1からツアーで辿った点の深さ,そのindex) USED=[0]*N while QUE: x=QUE.pop() EULER.append((DEPTH[x],x)) if USED[x]==1: continue for to,l in EDGELIST[x]: if USED[to]==0: DEPTH[to]=DEPTH[x]+1 QUE2.append(to) else: QUE.append(to) QUE.extend(QUE2) QUE2=deque() USED[x]=1 MINP=[1<<30]*N MAXP=[-1]*N for ind,(depth,p) in enumerate(EULER): MINP[p]=min(MINP[p],ind) MAXP[p]=max(MAXP[p],ind) LEN=len(EULER) seg_el=1<<(LEN.bit_length())# Segment treeの台の要素数 SEG=[(1<<30,0)]*(2*seg_el)# 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化 for i in range(LEN):# Dを対応する箇所へupdate SEG[i+seg_el]=EULER[i] for i in range(seg_el-1,0,-1):# 親の部分もupdate SEG[i]=min(SEG[i*2],SEG[i*2+1]) def update(n,x,seg_el):# A[n]をxへ更新(反映) i=n+seg_el SEG[i]=x i>>=1# 子ノードへ while i!=0: SEG[i]=min(SEG[i*2],SEG[i*2+1]) i>>=1 def getvalues(l,r):# 区間[l,r)に関するminを調べる L=l+seg_el R=r+seg_el ANS=(1<<30,0) while L>=1 R>>=1 return ANS def LCA(l,r): return getvalues(min(MINP[l],MINP[r]),max(MAXP[l],MAXP[r])+1) Q = deque([0]) DLENGTH=[0]*N USE=[0]*N USE[0]=1 while Q: x=Q.pop() for to,l in EDGELIST[x]: if USE[to]==0: Q.append(to) USE[to]=1 DLENGTH[to]=DLENGTH[x]+l #print(DLENGTH) Query=int(input()) def plusxy(x,y,ANS): if LCA(x,y) in {x,y}: ANS+=abs(DLENGTH[x]-DLENGTH[y]) else: ANS+=DLENGTH[x]+DLENGTH[y]-2*DLENGTH[LCA(x,y)[1]] return ANS for testcases in range(Query): x,y,z=map(int,(input().split())) ANS=0 ANS=plusxy(x,y,ANS) ANS=plusxy(y,z,ANS) ANS=plusxy(z,x,ANS) print(ANS//2)