#include int ri() { int n; scanf("%d", &n); return n; } std::vector > > hen; std::vector > parent; std::vector dist; std::vector depth; void dfs(int i, int prev) { parent[0][i] = prev; for (auto j : hen[i]) if (j.first != prev) { depth[j.first] = depth[i] + 1; dist[j.first] = dist[i] + j.second; dfs(j.first, i); } } int lca(int a, int b) { if (depth[a] < depth[b]) std::swap(a, b); for (int i = 20; i--; ) if ((depth[a] - depth[b]) >> i & 1) a = parent[i][a]; if (a == b) return a; for (int i = 20; i--; ) if (parent[i][a] != parent[i][b]) a = parent[i][a], b = parent[i][b]; return parent[0][a]; } int main() { int n = ri(); hen.resize(n); for (int i = 1; i < n; i++) { int a = ri() - 1; int b = ri() - 1; int c = ri(); hen[a].push_back({b, c}); hen[b].push_back({a, c}); } dist.resize(n); depth.resize(n); parent.resize(20, std::vector (n, -1)); dfs(0, -1); for (int i = 1; i < 20; i++) for (int j = 0; j < n; j++) parent[i][j] = parent[i - 1][j] == -1 ? -1 : parent[i - 1][parent[i - 1][j]]; int q = ri(); for (int i = 0; i < q; i++) { int x = ri() - 1; int y = ri() - 1; int lc = lca(x, y); printf("%d\n", dist[x] - dist[lc] + dist[y] - dist[lc]); } return 0; }