#include<bits/stdc++.h>
using namespace std;
template<typename T> void qr(T& x){
	x=0; char c=getchar(); int f=1;
	for(; !isdigit(c); c=getchar()) if(c=='-') f=-1;
	for(; isdigit(c); c=getchar()) x=x*10+(c-'0');
	x*=f;
}
template<typename T> void qw(T x){
	if(x<0) putchar('-'), x=-x;
	if(x>10) qw(x/10);
	putchar(x%10+'0');
}
const int N=5e3+10, M=5e5+10;
int f[M][25], dep[M], dq[M], ans[M]; vector<int> G[M];
struct node{int l, r, k, id;} a[M];
void dfs(int x, int fa){
	dep[x]=dep[fa]+1; f[x][0]=fa;
	for(int i=1; i<=19; i++) f[x][i]=f[f[x][i-1]][i-1];
	for(int y: G[x]) if(y!=fa) dfs(y, x);
}
int LCA(int x, int y){
	if(x==y) return x;
	if(dep[x]<dep[y]) swap(x, y);
	for(int i=19; i>=0; i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=19; i>=0; i--) if(f[x][i]!=f[y][i]) x=f[x][i], y=f[y][i];
	return f[x][0];
}
bool cmp(node n1, node n2){
	if(n1.l!=n2.l) return n1.l<n2.l;
	else return n1.r<n2.r; 
}
int main(){
	freopen("query.in", "r", stdin);
	freopen("query.out", "w", stdout);
	int n; qr(n);
	for(int i=1; i<n; i++){
		int x, y; qr(x); qr(y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	dep[0]=0; dfs(1, 0); 
	int q; qr(q);
	for(int i=1; i<=q; i++) qr(a[i].l), qr(a[i].r), qr(a[i].k), a[i].id=i;
	sort(a+1, a+q+1, cmp);
	a[0]={0, 0, 0};
	int l=1, r=0; 
	for(int i=1; i<=q; i++){
		int L=a[i].l, R=a[i].r, k=a[i].k-1; 
		int sum=0;
		//if(n<=5000){
			for(int x=L; x<=R-k; x++){
				int lca=x;
				for(int y=x+1; y<=x+k; y++){
					lca=LCA(lca, y);
				}
				sum=max(sum, dep[lca]);
			}
		//}
//		else{
//			while(l<=r && R-dq[l]>k) l++;
//			for(int i=a[i-1].r; i<=R; i++){
//				while(l<=r && dep[dq[r]]<dep[i]) r--;
//				dq[++r]=i;
//			}
//			while(l<=r && dq[r]>R) r--;
//			sum=dep[dq[l]];
//		}
		ans[a[i].id]=sum;
	}
	for(int i=1; i<=q; i++) qw(ans[i]), printf("\n");
	return 0;
}
