#include using namespace std; const int MAXN = 1e5 + 7; const int LOGN = 23; int n; vector > adj[MAXN]; array lca[MAXN][LOGN]; int depth[MAXN], par[MAXN], cost_par[MAXN]; void dfs(int u, int p = -1, int d = 0){ depth[u] = d; if(d == 0){ par[u] = u; cost_par[u] = 0; } else par[u] = p; for(auto edge: adj[u]){ int to = edge[0]; int w = edge[1]; if(to == p){ cost_par[u] = w; continue; } dfs(to, u, d + 1); } } void init_lca(){ dfs(0); for(int i = 0; i < n; ++i){ lca[i][0][0] = par[i]; lca[i][0][1] = cost_par[i]; } for(int j = 1; j < LOGN; ++j){ for(int i = 0; i < n; ++i){ lca[i][j][0] = lca[lca[i][j - 1][0]][j - 1][0]; lca[i][j][1] = lca[lca[i][j - 1][0]][j - 1][1] + lca[i][j - 1][1]; } } } pair find_lca(int u, int v){ if(depth[u] < depth[v]) swap(u, v); int dist = depth[u] - depth[v]; int ret = 0; for(int i = LOGN - 1; i >= 0; --i){ if((1 << i) & dist){ ret += lca[u][i][1]; u = lca[u][i][0]; } } if(u == v) return {u, ret}; for(int i = LOGN - 1; i >= 0; --i){ if(lca[u][i][0] != lca[v][i][0]){ ret += lca[u][i][1] + lca[v][i][1]; u = lca[u][i][0]; v = lca[v][i][0]; } } ret += lca[u][0][1] + lca[v][0][1]; u = lca[u][0][0]; v = lca[v][0][0]; return make_pair(u, ret); } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); freopen("meeting.in", "r", stdin); freopen("meeting.out", "w", stdout); cin >> n; for(int i = 0; i < n - 1; ++i){ int u, v, w; cin >> u >> v >> w; array edge1, edge2; edge1[0] = v; edge1[1] = w; edge2[0] = u; edge2[1] = w; adj[u].push_back(edge1); adj[v].push_back(edge2); } init_lca(); int q; cin >> q; while(q--){ int a, b, c; cin >> a >> b >> c; int possible[3]; possible[0] = find_lca(a, b).first; possible[1] = find_lca(a, c).first; possible[2] = find_lca(b, c).first; int mn = -1, best = -1; for(int p: possible){ int curr = find_lca(p, a).second + find_lca(p, b).second + find_lca(p, c).second; if(mn == -1 || curr < mn){ mn = curr; best = p; } } cout << best << " " << mn << "\n"; } }