#include #include #include #include using namespace std; typedef long long ll; struct edge{ int to; ll w; }; class LCA{ private: vector> v; vector> parent; vector depth; void dfs(int n,int m,int d){ parent[0][n] = m; depth[n] = d; for(auto x:v[n]){ if(x.to!=m) dfs(x.to,n,d+1); } } public: LCA(int N,int root,vector>& tree){ v = tree; parent = vector>(20,vector(N,0)); depth = vector(N,0); dfs(root,-1,0); for(int j=0;j+1<20;j++){ for(int i=0;idepth[m]) swap(n,m); for(int j=0;j<20;j++){ if((depth[m]-depth[n]) >> j&1) m = parent[j][m]; } if(n==m) return n; for(int j=19;j>=0;j--){ if(parent[j][n]!=parent[j][m]){ n = parent[j][n]; m = parent[j][m]; } } return parent[0][n]; } int dep(int n){return depth[n];} }; int main(){ int N; cin >> N; vector> tree(N); for(int i=0;i> a >> b >> w; tree[a].push_back({b,w}); tree[b].push_back({a,w}); } LCA lca(N,0,tree); vector dist(N,0); function dfs = [&](int cur,int par){ for(auto x:tree[cur]) if(par!=x.to) { dist[x.to] = dist[cur] + x.w; dfs(x.to,cur); } }; dfs(0,-1); int Q; cin >> Q; auto ans = [&](int x,int y,int z){ ll res = 2*(dist[x]+dist[y]+dist[z]); res -= 2*(dist[lca.lca(x,y)]+dist[lca.lca(y,z)]+dist[lca.lca(z,x)]); return res/2; }; for(int i=0;i> x >> y >> z; cout << ans(x,y,z) << endl; } }