#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
#define pb push_back
const int N=1e6+5;
int dfn[N],st[N][20],f[N][25],fa[N],L[N],R[N],val[N],dep[N],cnt,Time,ans[N],t[N*2];
int in[N],q,n,to[N],head[N],edgenum;
vector<int>E[N];
struct node{int l,r,id;};
vector<node>Q[N];
struct nade{int u,p;}a[N];
struct edge{int v,next;}e[N];
void add(int u,int v){
e[++edgenum]=edge{v,head[u]};
head[u]=edgenum;
}
int Min(int x,int y){return dfn[x]<dfn[y]?x:y;}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int LCA(int l,int r){
if(l==r)return l;
if((l=dfn[l])>(r=dfn[r]))swap(l,r);
int t=__lg((--r)-l+1);
return Min(st[l][t],st[r-(1<<t)+1][t]);
}
void dfs(int u,int fa){
st[Time][0]=fa;dfn[u]=++Time;
dep[u]=dep[fa]+1;
for(int i=head[u],v;i;i=e[i].next){
if((v=e[i].v)==fa)continue;
dfs(v,u);
}
}
void puup(int x){t[x]=max(t[x<<1],t[x<<1|1]);}
void change(int x,int l,int r,int p,int id,int w){
if(l==r){to[l]=id;t[x]=w;return;}
int mid=(l+r)>>1;
if(mid>=p)change(x<<1,l,mid,p,id,w);
else change(x<<1|1,mid+1,r,p,id,w);
puup(x);
}
int ask(int x,int l,int r,int L,int R){
if(l>=L&&r<=R)return t[x];
int mid=(l+r)>>1,rec=0;
if(mid>=L)rec=ask(x<<1,l,mid,L,R);
if(mid+1<=R)rec=max(rec,ask(x<<1|1,mid+1,r,L,R));
return rec;
}
int findp(int x,int l,int r,int p){
if(p==0||!t[x])return 0;
if(l==r)return to[l];
int mid=(l+r)>>1,rec=0;
if(p>=mid+1)rec=findp(x<<1|1,mid+1,r,p);
if(!rec)rec=findp(x<<1,l,mid,p);
return rec;
}
int finds(int x,int l,int r,int p){
if(p>n||!t[x])return 0;
if(l==r)return to[l];
int mid=(l+r)>>1,rec=0;
if(mid>=p)rec=finds(x<<1,l,mid,p);
if(!rec)rec=finds(x<<1|1,mid+1,r,p);
return rec;
}
bool chk(int x,int l,int r,int k){return max(l,L[x])+k-1<=min(r,R[x]);}
int Up(int x,int l,int r,int k){
if(chk(x,l,r,k))return val[x];
for(int i=20;i>=0;i--)
if(f[x][i]&&!chk(f[x][i],l,r,k))x=f[x][i];
return val[f[x][0]];
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1,u,v;i<n;i++){
u=read();v=read();
add(u,v);add(v,u);
}dfs(1,0);
for(int j=1;j<=19;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
st[i][j]=Min(st[i][j-1],st[i+(1<<j-1)][j-1]);
cnt=n;
for(int i=1;i<=n;i++){
fa[i]=i;L[i]=R[i]=i;val[i]=dep[i];
if(i<n)a[i]=nade{LCA(i,i+1),i};
}sort(a+1,a+n,[](nade x,nade y){return dep[x.u]==dep[y.u]?(x.u==y.u?x.p<y.p:x.u<y.u):dep[x.u]>dep[y.u];});
R[0]=-1;
for(int l=1,r;l<n;l=r+1){
for(r=l;r+1<n&&a[r+1].u==a[l].u;r++);
int now=0,D=dep[a[l].u];
for(int i=l;i<=r;i++){
int x=find(a[i].p),y=find(a[i].p+1);
if(R[now]+1==L[x]){
f[x][0]=f[y][0]=now;
R[now]=R[y];
fa[x]=fa[y]=now;
}else{
now=++cnt;val[now]=D;
f[x][0]=f[y][0]=fa[now]=now;
fa[x]=fa[y]=now;
L[now]=L[x];R[now]=R[y];
}
}
}
for(int j=1;j<=20;j++)
for(int i=1;i<=cnt;i++)
f[i][j]=f[f[i][j-1]][j-1];
for(int i=1;i<=cnt;i++){
if(f[i][0])in[f[i][0]]++;
E[R[i]-L[i]+2].pb(i);
}for(int i=1;i<=cnt;i++)
if(!in[i])change(1,1,n,L[i],i,val[i]);
q=read();
for(int l,r,k,i=1;i<=q;i++){
l=read();r=read();k=read();
Q[k].pb(node{l,r-k+1,i});
}for(int k=1;k<=n;k++){
for(auto w:E[k]){
change(1,1,n,L[w],0,0);int fa=f[w][0];
if(fa){if(!--in[fa])change(1,1,n,L[fa],fa,val[fa]);}
}for(auto [l,r,id]:Q[k]){
ans[id]=ask(1,1,n,l,r);
int ql=findp(1,1,n,l-1),qr=finds(1,1,n,r+1);
if(ql)ans[id]=max(ans[id],Up(ql,l,r+k-1,k));
if(qr)ans[id]=max(ans[id],Up(qr,l,r+k-1,k));
}
}for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
}