#include #include #include #include const int NMAX = 112345; long long sz[NMAX]; int depth[NMAX]; int up[NMAX][60]; std::vector> g[NMAX]; void dfs(int cur, int par) { up[cur][0] = par; sz[cur] = (par == -1 ? 0 : sz[par]) + sz[cur]; depth[cur] = (par == -1 ? 0 : depth[par]) + 1; for (std::pair p : g[cur]) { int dst = p.first; long long w = p.second; if (dst == par) continue; sz[dst] += w; dfs(dst, cur); } } int lca(int u, int v) { if (depth[u] != depth[v]) { if (depth[u] > depth[v]) { u ^= v; v ^= u; u ^= v; } int diff = depth[v] - depth[u]; for (int i = 0; i < 60; ++i) { if ((diff & (1LL << i)) > 0) { v = up[v][i]; } } } if (u == v) return u; assert(depth[u] == depth[v]); assert(u != -1 && v != -1); assert(u != v); for (int i = 59; i >= 0; --i) { if (up[v][i] != up[u][i]) { v = up[v][i]; u = up[u][i]; } } assert(u != -1 && v != -1); assert(depth[u] == depth[v]); assert(u != v); return up[u][0]; } int main() { int N; std::cin >> N; for (int i = 0; i < N - 1; ++i) { int u, v; long long w; std::cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); } dfs(0, -1); for (int i = 1; i < 60; ++i) { for (int j = 0; j < N; ++j) { if (up[j][i - 1] != -1) up[j][i] = up[up[j][i - 1]][i - 1]; else up[j][i] = -1; } } int Q; std::cin >> Q; for (int i = 0; i < Q; ++i) { int x, y, z; std::cin >> x >> y >> z; long long ans = sz[x] + sz[y] + sz[z] - sz[lca(x, y)] - sz[lca(y, z)] - sz[lca(z, x)] + sz[lca(x, lca(y, z))]; if (ans < 0) ans *= -1; std::cout << ans << std::endl; } }