#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,q,l,r,k,dep[N];
long long ans;
int h[N],e[N*2],ne[N*2],idx;
struct Tree{
int l,r,lca;
}t[N*4];
void add(int x,int y){
e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
int read(){
int x=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
void dfs(int x){
for(int i=h[x];~i;i=ne[i]){
int y=e[i];
dep[y]=dep[x]+1;
}
}
int LCA(int x,int y){
if(dep[x]>=dep[y]) return x;
else return y;
}
void pushup(int p){
t[p<<1].lca=max(t[p<<1].lca,t[p<<1|1].lca);
}
void build(int p,int l,int r){
t[p]={l,r,LCA(l,r)};
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
long long query(int p,int l,int r){
if(l<=t[p].l&&r>=t[p].r) return t[p].lca;
int mid=t[p].l+t[p].r>>1;
long long val=0;
if(l<=mid) val=max(val,query(p<<1,l,r));
if(r>mid) val=max(val,query(p<<1|1,l,r));
return val;
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
memset(h,-1,sizeof h);
n=read();
for(int i=1;i<n;i++) l=read(),r=read(),add(l,r),add(r,l);
dfs(1);
q=read();
while(q--){
ans=0;
l=read(),r=read(),k=read();
for(int len=0;len<=k;len++)
for(int ll=l;ll+len-1<=r;ll++){
int rr=ll+len-1;
ans=max(ans,query(1,ll,rr));
}
printf("%ld\n",ans);
}
return 0;
}