#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define p1 p<<1
#define p2 p<<1|1
const int N=5e5+10;
int n,head[N],tot,dep[N],lg[N],fa[N][20];
int tr[N*4];
struct edge{
int v,nxt;
}e[N*2];
void add(int u,int v){
++tot;
e[tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
void dfs(int x,int fx){
dep[x]=dep[fx]+1;
fa[x][0]=fx;
for(int i=head[x];~i;i=e[i].nxt){
if(e[i].v==fx){
continue;
}
dfs(e[i].v,x);
}
}
int lca(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
for(int i=lg[n];i>=0;i--){
if(dep[fa[x][i]]>=dep[y]){
x=fa[x][i];
}
}
if(x==y){
return x;
}
for(int i=lg[n];i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
void build(int l,int r,int p){
if(l==r){
tr[p]=l;
return;
}
int mid=l+r>>1;
build(l,mid,p1);
build(mid+1,r,p2);
tr[p]=lca(tr[p1],tr[p2]);
}
int query(int l,int r,int p,int le,int ri){
if(l==le&&r==ri){
return tr[p];
}
int mid=l+r>>1;
if(ri<=mid){
return query(l,mid,p1,le,ri);
}
else if(mid+1<=le){
return query(mid+1,r,p2,le,ri);
}
else{
return lca(query(l,mid,p1,le,mid),query(mid+1,r,p2,mid+1,ri));
}
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<=n;i++) lg[i]=log(i)/log(2);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
dfs(1,0);
for(int j=1;j<=lg[n];j++){
for(int i=1;i<=n;i++){
fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
build(1,n,1);
int q;
scanf("%d",&q);
while(q--){
int l,r,k,ans=0;
scanf("%d%d%d",&l,&r,&k);
for(int i=l;i+k-1<=r;i++){
ans=max(ans,dep[query(1,n,1,i,i+k-1)]);
}
printf("%d\n",ans);
}
return 0;
}