#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
#define N 500001
#define M 1000000
using namespace std;
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
struct reads
{
int num,data;
};
struct rds
{
int l,r;
bool operator < (const rds &t)const
{
return l!=t.l?l<t.l:r<t.r;
}
};
set<rds>s[N+1];
struct dst
{
int num,l,r;
};
int n,q,lengs,leng,lengths,tans[N+1],L[N+1],R[N+1],depth[N+1],rt[N+1],num[N+1],length,fa[N+1],ST[M+1][21],delta[N+1][21],dfn[N+1],rev[N+1],tong[M+1],lg[M+1],maxn;
bool used[N+1];
vector<int>E[N+1];
vector<reads>v[N+1];
vector<reads>v2[N+1];
vector<dst>sv[N+1];
vector<dst>sv2[N+1];
void add(int x,int y)
{
E[x].push_back(y),E[y].push_back(x);
return;
}
rds adder(rds x,rds y,int ds)
{
if (x.r-x.l<=y.r-y.l)
{
for (int i=x.l;i<=x.r;++i) v[y.r-i+1].push_back((reads){i,ds});
}
else
{
for (int i=y.l;i<=y.r;++i) v2[i-x.l+1].push_back((reads){i,ds});
}
return (rds){x.l,y.r};
}
void merge(int x,int y,int ds)
{
rds d;
if (s[x].size()>s[y].size()) swap(s[x],s[y]);
for (auto it:s[x])
{
d=it;
auto it2=s[y].lower_bound(it);
if (it2!=s[y].end()&&it.r+1==(*it2).l) d=adder(d,(*it2),ds),s[y].erase(it2);
auto it3=s[y].lower_bound(it);
if (it3!=s[y].begin())
{
it3--;
if ((*it3).r+1==it.l) d=adder((*it3),d,ds),s[y].erase(it3);
}
s[y].insert(d);
}
s[x].clear();
return;
}
void dfs(int x)
{
used[x]=1,s[x].insert((rds){x,x}),v[1].push_back((reads){x,depth[x]});
for (int i=0;i<E[x].size();++i)
if (!used[E[x][i]])
depth[E[x][i]]=depth[x]+1,dfs(E[x][i]),merge(E[x][i],x,depth[x]);
return;
}
struct seg
{
struct node
{
int l,r,maxn;
};
node tree[(N<<2)+1];
void build(int k,int l,int r)
{
tree[k].l=l,tree[k].r=r;
if (l==r) return;
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
return;
}
void push_up(int k)
{
tree[k].maxn=max(tree[k<<1].maxn,tree[k<<1|1].maxn);
return;
}
void add(int k,int x,int d)
{
if (tree[k].l==tree[k].r)
{
tree[k].maxn=max(tree[k].maxn,d);
return;
}
int mid=(tree[k].l+tree[k].r)>>1;
if (x<=mid) add(k<<1,x,d);
else add(k<<1|1,x,d);
push_up(k);
return;
}
int query(int k,int l,int r)
{
if (tree[k].l==l&&tree[k].r==r) return tree[k].maxn;
int mid=(tree[k].l+tree[k].r)>>1;
if (r<=mid) return query(k<<1,l,r);
else if (l>=mid+1) return query(k<<1|1,l,r);
else return max(query(k<<1,l,mid),query(k<<1|1,mid+1,r));
}
};
seg T,T2;
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
int x,y,l,r,k;
for (int i=2;i<=M;++i) lg[i]=lg[i>>1]+1;
n=read();
for (int i=1;i<=n-1;++i) x=read(),y=read(),add(x,y);
depth[1]=1,dfs(1),q=read();
for (int i=1;i<=q;++i) l=read(),r=read(),k=read(),sv[k].push_back((dst){i,l,r-k+1}),sv2[k].push_back((dst){i,l+k-1,r});
T.build(1,1,n),T2.build(1,1,n);
for (int i=n;i>=1;--i)
{
for (int j=0;j<v[i].size();++j) T.add(1,v[i][j].num,v[i][j].data);
for (int j=0;j<v2[i].size();++j) T2.add(1,v2[i][j].num,v2[i][j].data);
for (int j=0;j<sv[i].size();++j) tans[sv[i][j].num]=max(tans[sv[i][j].num],T.query(1,sv[i][j].l,sv[i][j].r));
for (int j=0;j<sv2[i].size();++j) tans[sv2[i][j].num]=max(tans[sv2[i][j].num],T2.query(1,sv2[i][j].l,sv2[i][j].r));
}
for (int i=1;i<=q;++i) printf("%d\n",tans[i]);
return 0;
}