#include<bits/stdc++.h>
using namespace std ;
const int N = 5e5+10 , K = log2(5e5) ;
int n , q ; 
int h[N] , to[N<<1] , Next[N<<1] , idx ;
int dep[N] ;
int p[N][K+10] ;
int tr[N<<2] ;
bool fA = false ;
void add(int u , int v){
	to[++idx] = v , Next[idx] = h[u] , h[u] = idx ;
}
void dfs(int u , int fa){
	dep[u] = dep[fa]+1 , p[u][0] = fa ;
	if(dep[u] == n) fA = true ;
	for(int i = 1 ; p[u][i-1] && i <= K ; i++){ // !!!!!
		p[u][i] = p[p[u][i-1]][i-1] ;
	}
	for(int i = h[u] ; i ; i = Next[i]){
		int v = to[i] ;
		if(v == fa) continue ;
		dfs(v , u) ;
	}
}
int lca(int u , int v){
	if(dep[u] < dep[v]) swap(u , v) ;
	for(int i = K ; i >= 0 ; i--){
		if(dep[p[u][i]] >= dep[v]) u = p[u][i] ;
	}
	if(u == v) return u ;
	for(int i = K ; i >= 0 ; i--){
		if(p[u][i] != p[v][i]){
			u = p[u][i] , v = p[v][i] ;
		}
	}
	return p[u][0] ;
}
void push_up(int &root , int &le , int &ri){
	if(!le) root = ri ;
	else if(!ri) root = le ;
	else root = lca(le , ri) ; 
}
void build(int u , int l , int r){
	if(l == r) tr[u] = l ;
	else{
		int mid = l+r>>1 ;
		build(u<<1 , l , mid) ;
		build(u<<1|1 , mid+1 , r) ;
		push_up(tr[u] , tr[u<<1] , tr[u<<1|1]) ;
	}
}
int query(int u , int l , int r , int L , int R){
	if(L <= l && r <= R) return tr[u] ;
	else{
		int mid = l+r>>1 ;
		int root = 0 , le = 0 , ri = 0 ;
		if(L <= mid) le = query(u<<1 , l , mid , L , R) ;
		if(R > mid) ri = query(u<<1|1 , mid+1 , r , L , R) ;
		push_up(root , le , ri) ;
		return root ;
	}
}
int main(){
	freopen("query.in" , "r" , stdin) ;
	freopen("query.out" , "w" , stdout) ;
	scanf("%d", &n) ;
	for(int i = 1 ; i < n ; i++){
		int u , v ;
		scanf("%d%d", &u , &v) ;
		add(u , v) , add(v , u) ;
	}
	dfs(1 , 0) ;
	build(1 , 1 , n) ;
	scanf("%d", &q) ;
	int l , r , k ;
	while(q--){
		scanf("%d%d%d", &l , &r , &k) ;
		int ans = 0 ;	
		for(int L = l , R = l+k-1 ; R <= r ; L++ , R++){
			ans = max(ans , dep[query(1 , 1 , n , L , R)]) ;
		}
		printf("%d\n", ans) ;
	}
	return 0 ;
}
/*
想知道[l, r]中任意长度大于等于k的连续子区间的最近公共祖先深度的最大值
相当于[l, r]中长度等于k连续子区间的最近公共祖先深度的最大值 O(qnlogn)
*/ 

