#include #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; template struct lca { int n, l; vector> to; vector> co; vector dep; vector costs; vector> par; lca(int n): n(n), to(n), co(n), dep(n), costs(n) { l = 0; while (1<>(n, vector(l, -1)); } void addEdge(int a, int b, T c=1) { to[a].push_back(b); co[a].push_back(c); to[b].push_back(a); co[b].push_back(c); } void dfs(int v, int d=0, T c=0, int p=-1) { par[v][0] = p; dep[v] = d; costs[v] = c; rep(i, to[v].size()) { int u = to[v][i]; if (u == p) continue; dfs(u, d+1, c+co[v][i], v); } } void init(int root=0) { dfs(root); rep(i, l-1) { rep(v, n) { par[v][i+1] = par[v][i]==-1 ? -1 : par[par[v][i]][i]; } } } // LCA int operator()(int a, int b) { if (dep[a] > dep[b]) swap(a, b); int gap = dep[b]-dep[a]; for (int i = l-1; i >= 0; --i) { int len = 1<= len) { gap -= len; b = par[b][i]; } } if (a == b) return a; for (int i = l-1; i >= 0; --i) { int na = par[a][i]; int nb = par[b][i]; if (na != nb) a = na, b = nb; } return par[a][0]; } int length(int a, int b) { int c = (*this)(a, b); return dep[a]+dep[b]-dep[c]*2; } T dist(int a, int b) { int c = (*this)(a, b); return costs[a]+costs[b]-costs[c]*2; } }; int main() { cin.tie(nullptr) -> sync_with_stdio(false); int n; cin >> n; lca g(n); rep(i, n-1) { int a, b, c; cin >> a >> b >> c; g.addEdge(a, b, c); } g.init(); int q; cin >> q; rep(qi, q) { int x, y, z; cin >> x >> y >> z; ll ans = (g.dist(x, y) + g.dist(y, z) + g.dist(x, z)) / 2; cout << ans << '\n'; } return 0; }