#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template<typename A>
using vc=vector<A>;
using pi=pair<int,int>;
inline int read()
{
int s=0,w=1;char ch;
while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline ll lread()
{
ll s=0,w=1;char ch;
while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
struct node
{
int l,r,ans,len;
}a[1000005];
struct Q
{
int l,r,k,id;
}b[500005];
int num[2000005];
int qans[500005];
vc<pi>V[500005];
vc<int>g[500005];
int dfn[500005],siz[500005];
int tol[500005],tor[500005];
int dep[500005];
int n,m,c,tim;
inline bool check(int u,int v)
{
if(v<=0||v>n) return false;
return dfn[u]<=dfn[v]&&dfn[v]<dfn[u]+siz[u];
}
inline void merge(int u,int v)
{
if(V[u].size()<V[v].size()) V[u].swap(V[v]);
for(auto i:V[v])
{
int l=i.first,r=i.second;
if(tor[l]!=r||tol[r]!=l) continue;
bool f=0;tor[l]=tol[r]=0;
if(check(u,l-1))
{
int R=l-1,L=tol[R];
tor[L]=tol[R]=0;
l=L;f=1;
}
if(check(u,r+1))
{
int L=r+1,R=tor[L];
tor[L]=tol[R]=0;
r=R;f=1;
}
tor[l]=r,tol[r]=l;
V[u].push_back(pi(l,r));
if(f)
{
c++;
a[c].l=l,a[c].r=r;
a[c].ans=dep[u];
}
}
}
void dfs(int num,int fa)
{
dfn[num]=++tim,siz[num]=1;
dep[num]=dep[fa]+1;
V[num].push_back(pi(num,num));
tol[num]=tor[num]=num;
c++,a[c].l=a[c].r=num,a[c].ans=dep[num];
for(int p:g[num]) if(p!=fa)
{
dfs(p,num);
siz[num]+=siz[p];
merge(num,p);
}
}
void build(int p,int pl,int pr)
{
num[p]=0;
if(pl==pr) return ;
int mid=(pl+pr)>>1;
build(p*2,pl,mid);
build(p*2|1,mid+1,pr);
}
void change(int p,int pl,int pr,int x,int y)
{
num[p]=max(num[p],y);
if(pl==pr) return ;
int mid=(pl+pr)>>1;
if(x<=mid) change(p*2,pl,mid,x,y);
else change(p*2|1,mid+1,pr,x,y);
}
int get(int p,int pl,int pr,int l,int r)
{
if(l<=pl&&pr<=r) return num[p];
int mid=(pl+pr)>>1,ans=0;
if(l<=mid) ans=max(ans,get(p*2,pl,mid,l,r));
if(mid<r) ans=max(ans,get(p*2|1,mid+1,pr,l,r));
return ans;
}
inline void Max(int &a,int b)
{
if(b>a) a=b;
}
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0);
m=read();
for(int i=1;i<=m;i++) b[i].l=read(),b[i].r=read(),b[i].k=read(),b[i].id=i,qans[i]=0;
for(int i=1;i<=c;i++) a[i].len=a[i].r-a[i].l+1;
build(1,1,n);
sort(a+1,a+c+1,[](node a,node b){ return a.len>b.len;});
sort(b+1,b+m+1,[](Q a,Q b){ return a.k>b.k;});
int now=1;
for(int i=1;i<=m;i++)
{
while(now<=c&&a[now].len>=b[i].k)
{
change(1,1,n,a[now].l,a[now].ans),now++;
}
Max(qans[b[i].id],get(1,1,n,b[i].l,b[i].r-b[i].k+1));
}
build(1,1,n);
sort(a+1,a+c+1,[](node a,node b){ return a.l<b.l;});
sort(b+1,b+m+1,[](Q a,Q b){ return a.l<b.l;});
now=1;
for(int i=1;i<=m;i++)
{
while(now<=c&&a[now].l<=b[i].l)
{
change(1,1,n,a[now].r,a[now].ans),now++;
}
Max(qans[b[i].id],get(1,1,n,b[i].l+b[i].k-1,n));
}
for(int i=1;i<=m;i++) printf("%d\n",qans[i]);
return 0;
}