#include using namespace std; typedef long long ll; typedef pair p_ll; template void debug(T itr1, T itr2) { auto now = itr1; while(now=0; i--) const ll MOD = pow(10,9)+7; const ll LLINF = pow(2,61)-1; const int INF = pow(2,30)-1; vector fac; void c_fac(int x=pow(10,6)+10) { fac.resize(x,true); rep(i,x) fac[i] = i ? (fac[i-1]*i)%MOD : 1; } ll inv(ll a, ll m=MOD) { ll b = m, x = 1, y = 0; while (b!=0) { int d = a/b; a -= b*d; swap(a,b); x -= y*d; swap(x,y); } return (x+m)%m; } ll nck(ll n, ll k) { return fac[n]*inv(fac[k]*fac[n-k]%MOD)%MOD; } ll gcd(ll a, ll b) { if (a pos; // SegTree(ll N) { size = 1; while(size>=1) operate(x); } ll query(ll a, ll b) { stp L = {-1,LLINF}, R = {-1,LLINF}; for (a+=size, b+=size; a>=1, b>>=1) { if (a&1) { L = q(L,pos[a]); a++; } if (b&1) { b--; R = q(R,pos[b]); } } return q(L,R).i; } void operate(ll i) { pos[i] = min(pos[i*2], pos[i*2+1]); } stp q(stp x, stp y) { return min(x, y); } }; // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- struct edge { ll to, i, d; }; vector> adj; struct range { ll l, r, d; }; vector ran; vector tour; SegTree st; ll LCA(ll x, ll y) { if (ran[x].l d; void calc_d(ll n=0, ll p=-1) { if (n==0) d[0] = 0; for (auto x: adj[n]) { if (x.to==p) continue; d[x.to] = d[n] + x.d; calc_d(x.to,n); } } int main() { ll N; cin >> N; adj.resize(N); rep(i,N-1) { ll u, v, w; cin >> u >> v >> w; adj[u].push_back({v,i,w}); adj[v].push_back({u,i,w}); } d.resize(N); calc_d(); // debug(all(d)); EulerTour(); ll Q; cin >> Q; rep(_,Q) { ll x, y, z; cin >> x >> y >> z; ll xy = d[x] + d[y] - d[LCA(x,y)]*2; ll yz = d[y] + d[z] - d[LCA(y,z)]*2; ll zx = d[z] + d[x] - d[LCA(z,x)]*2; ll result = (xy+yz+zx)/2; // cout << xy << " " << yz << " " << zx << endl; cout << result << endl; } return 0; }