#include #define rep(i, a, n) for(int i = a; i < n; i++) #define int long long using namespace std; typedef pair P; const int mod = 1000000007; const int INF = 1e18; struct LowestCommonAncestor{ const int MAX_LOG_V = 50; vector > G, parent; int root = 0, V; vector depth; LowestCommonAncestor(int _V){ V = _V; G.resize(V); parent.resize(MAX_LOG_V, vector(V)); depth.resize(V); } void add_edge(int u, int v){ G[u].push_back(v); G[v].push_back(u); } void dfs(int v, int p, int d){ parent[0][v] = p; depth[v] = d; for(int i = 0; i < G[v].size(); i++){ if(G[v][i] != p) dfs(G[v][i], v, d + 1); } } void build(){ dfs(root, -1, 0); for(int k = 0; k + 1 < MAX_LOG_V; k++){ for(int v = 0; v < V; v++){ if(parent[k][v] < 0) parent[k + 1][v] = -1; else parent[k + 1][v] = parent[k][parent[k][v]]; } } } int query(int u, int v){ if(depth[u] > depth[v]) swap(u, v); for(int k = 0; k < MAX_LOG_V; k++){ if((depth[v] - depth[u]) >> k & 1){ v = parent[k][v]; } } if(u == v) return u; for(int k = MAX_LOG_V - 1; k >= 0; k--){ if(parent[k][u] != parent[k][v]){ u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } }; struct edge{ int v, w; }; vector G[100010]; int sum[100010]; void dfs(int v, int p, int now){ sum[v] = now; for(auto i : G[v]){ if(i.v == p) continue; dfs(i.v, v, now + i.w); } } signed main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; LowestCommonAncestor lca(n); rep(i, 0, n - 1){ int u, v, w; cin >> u >> v >> w; G[u].push_back({v, w}); G[v].push_back({u, w}); lca.add_edge(u, v); } dfs(0, -1, 0); lca.build(); int q; cin >> q; while(q--){ int x, y, z; cin >> x >> y >> z; auto f = [](int u, int v, int w){ return sum[u] + sum[v] - 2 * sum[w]; }; int ans = (f(x, y, lca.query(x, y)) + f(y, z, lca.query(y, z)) + f(z, x, lca.query(z, x))) / 2; cout << ans << endl; } }