#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+7;
const int mod = 1e9+7;
template <typename T>inline void read(T &x)
{
x=0;char c=getchar();bool f=0;
for(;c<'0'||c>'9';c=getchar())f|=(c=='-');
for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
x=(f?-x:x);
}
int n,m;
int a[N],dep[N];
vector<int> G[N];
int fa[N],top[N],siz[N],son[N];
void dfs(int x,int pre)
{
dep[x]=dep[pre]+1;
fa[x]=pre;
siz[x]=1;
for(int y:G[x])if(y!=pre)
{
dfs(y,x);
if(siz[y]>siz[son[x]])son[x]=y;
siz[x]+=siz[y];
}
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
return x;
}
int ans[N];
void dfs2(int x,int topth)
{
top[x]=topth;
if(!son[x])return;
dfs2(son[x],topth);
for(int y:G[x])if(y!=son[x]&&y!=fa[x])
dfs2(y,y);
}
pair<int,int> val[N];
int mx[N<<3],pos[N<<2];
void build(int k,int l,int r)
{
mx[k]=0;
if(l==r)
{
pos[l]=k;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void upd(int x,int v)
{
x=pos[x];
while(x)mx[x]=max(mx[x],v),x>>=1;
}
int qmx(int k,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return mx[k];
int mid=(l+r)>>1,res=0;
if(L<=mid)res=max(res,qmx(k<<1,l,mid,L,R));
if(R>mid) res=max(res,qmx(k<<1|1,mid+1,r,L,R));
return res;
}
struct node
{
int x,y,v;
};
vector<node>W[3][N*2],Q[3][N*2];
int pre[N],nxt[N];
void Append(int l,int r,int v)
{
W[0][l].push_back((node){r,r,v});
W[1][r].push_back((node){l,l,v});
W[2][r-l+1].push_back((node){l+r,l+r,v});
}
int tr[N];
void modi(int x,int v)
{
for(int i=x;i<=n;i+=i&-i)tr[i]=max(tr[i],v);
}
int ask(int x)
{
int res=0;
for(int i=x;i;i-=i&-i)res=max(res,tr[i]);
return res;
}
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
read(n);
for(int i=1;i<n;i++)
{
int u,v;
read(u);read(v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);dfs2(1,0);
read(m);
for(int i=1;i<=n;i++)Append(i,i,dep[i]),pre[i]=nxt[i]=i;
for(int i=1;i<n;i++)val[i]={dep[lca(i,i+1)],i};
sort(val+1,val+n);
for(int i=n-1;i>=1;i--)
{
int x=val[i].second;
nxt[pre[x]]=nxt[x+1];
pre[nxt[x+1]]=pre[x];
Append(pre[x],nxt[x+1],val[i].first);
}
for(int i=1;i<=m;i++)
{
int l,r,k;
read(l);read(r);read(k);
Q[0][l].push_back({l+k-1,n,i});
Q[1][r].push_back({1,r-k+1,i});
Q[2][k].push_back({2*l+k-1,2*r-k+1,i});
}
for(int i=1;i<=n;i++)
{
for(auto u:W[0][i])modi(n-u.x+1,u.v);
for(auto u:Q[0][i])ans[u.v]=max(ans[u.v],ask(n-u.x+1));
}
for(int i=1;i<=n;i++)tr[i]=0;
for(int i=n;i>=1;i--)
{
for(auto u:W[1][i])modi(u.x,u.v);
for(auto u:Q[1][i])ans[u.v]=max(ans[u.v],ask(u.y));
}
build(1,1,2*n);
for(int i=n;i>=1;i--)
{
for(auto u:W[2][i])upd(u.x,u.v);
for(auto u:Q[2][i])ans[u.v]=max(ans[u.v],qmx(1,1,2*n,u.x,u.y));
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}