#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt,head[1000010];
struct Edge
{
int to,next;
}edge[1000010];
void add(int u,int v)
{
edge[++cnt].to=v,edge[cnt].next=head[u],head[u]=cnt;
}
bool vis[1000010];
int nodetot;
struct node
{
int ls,rs;
int llen,rlen;
}tree[20000010];
struct range
{
int l,r,id;
};
int dep[1000010];
int root[1000010];
vector<range> addval[1000010],que[1000010];
int tot,now[1000010];
int ans[1000010];
void update(int x,int l,int mid,int r)
{
if(tree[tree[x].ls].llen==mid-l+1) tree[x].llen=mid-l+1+tree[tree[x].rs].llen;
else tree[x].llen=tree[tree[x].ls].llen;
if(tree[tree[x].rs].rlen==r-mid) tree[x].rlen=r-mid+tree[tree[x].ls].rlen;
else tree[x].rlen=tree[tree[x].rs].rlen;
return ;
}
int merge(int x,int y,int l,int r)
{
if(!x||!y) return x|y;
int mid=(l+r)>>1;
tree[x].ls=merge(tree[x].ls,tree[y].ls,l,mid);
tree[x].rs=merge(tree[x].rs,tree[y].rs,mid+1,r);
update(x,l,mid,r);
if(!vis[mid]&&tree[tree[x].ls].rlen&&tree[tree[x].rs].llen) now[++tot]=mid,vis[mid]=1;
return x;
}
void change(int &o,int l,int r,int x)
{
if(!o) o=++nodetot;
if(l==r)
{
tree[o].llen=tree[o].rlen=1;
return ;
}
int mid=(l+r)>>1;
if(x<=mid) change(tree[o].ls,l,mid,x);
else change(tree[o].rs,mid+1,r,x);
update(o,l,mid,r);
return ;
}
int query_lst(int o,int l,int r,int ql,int qr)
{
if(tree[o].llen==r-l+1) return 0;
if(l==r) return l;
if(ql<=l&&r<=qr)
{
int mid=(l+r)>>1;
if(tree[tree[o].rs].llen!=r-mid) return query_lst(tree[o].rs,mid+1,r,ql,qr);
return query_lst(tree[o].ls,l,mid,ql,qr);
}
int mid=(l+r)>>1;
int ans=0;
if(mid<qr) ans=query_lst(tree[o].rs,mid+1,r,ql,qr);
if(ans) return ans;
if(ql<=mid) ans=query_lst(tree[o].ls,l,mid,ql,qr);
return ans;
}
int query_nxt(int o,int l,int r,int ql,int qr)
{
if(tree[o].llen==r-l+1) return n+1;
if(l==r) return l;
if(ql<=l&&r<=qr)
{
int mid=(l+r)>>1;
if(tree[tree[o].ls].llen!=mid-l+1) return query_nxt(tree[o].ls,l,mid,ql,qr);
return query_nxt(tree[o].rs,mid+1,r,ql,qr);
}
int mid=(l+r)>>1;
int ans=n+1;
if(ql<=mid) ans=query_nxt(tree[o].ls,l,mid,ql,qr);
if(ans!=n+1) return ans;
if(mid<qr) ans=query_nxt(tree[o].rs,mid+1,r,ql,qr);
return ans;
}
void print(int o,int l,int r)
{
if(!o) return ;
if(l==r) printf("%d ",l);
int mid=(l+r)>>1;
print(tree[o].ls,l,mid);
print(tree[o].rs,mid+1,r);
return ;
}
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
dfs(v,u);
}
tot=0;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
merge(root[u],root[v],1,n);
}
for(int i=1;i<=tot;i++)
{
int l=query_lst(root[u],1,n,1,now[i])+1;
int r=query_nxt(root[u],1,n,now[i],n)-1;
addval[r-l+1].push_back((range){l,r,dep[u]});
}
addval[1].push_back((range){u,u,dep[u]});
return ;
}
int maxx[2100010];
void c(int o,int l,int r,int x,int val)
{
if(l==r)
{
maxx[o]=max(maxx[o],val);
return ;
}
int mid=(l+r)>>1;
if(x<=mid) c(o<<1,l,mid,x,val);
else c(o<<1|1,mid+1,r,x,val);
maxx[o]=max(maxx[o<<1],maxx[o<<1|1]);
return ;
}
int q(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr) return maxx[o];
int mid=(l+r)>>1,ans=0;
if(ql<=mid) ans=q(o<<1,l,mid,ql,qr);
if(mid<qr) ans=max(ans,q(o<<1|1,mid+1,r,ql,qr));
return ans;
}
vector<range> aval[1000010],qval[1000010];
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i=1;i<=n;i++) change(root[i],1,n,i);
dfs(1,0);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
que[k].push_back((range){l,r,i});
}
for(int i=n;i>=1;i--)
{
for(int j=0;j<addval[i].size();j++)
{
int x=addval[i][j].l,val=addval[i][j].id;
c(1,1,n,x,val);
}
for(int j=0;j<que[i].size();j++)
{
int ql=que[i][j].l,qr=que[i][j].r-i+1;
ans[que[i][j].id]=q(1,1,n,ql,qr);
}
}
memset(maxx,0,sizeof(maxx));
for(int i=n;i>=1;i--)
{
for(int j=0;j<addval[i].size();j++)
{
int x=addval[i][j].r,val=addval[i][j].id;
c(1,1,n,x,val);
}
for(int j=0;j<que[i].size();j++)
{
int ql=que[i][j].l+i-1,qr=que[i][j].r;
ans[que[i][j].id]=max(ans[que[i][j].id],q(1,1,n,ql,qr));
}
}
memset(maxx,0,sizeof(maxx));
for(int i=1;i<=n;i++)
{
for(int j=0;j<addval[i].size();j++)
{
int l=addval[i][j].l;
aval[l].push_back(addval[i][j]);
}
for(int j=0;j<que[i].size();j++)
{
int l=que[i][j].l;
qval[l].push_back(que[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<aval[i].size();j++)
{
int x=aval[i][j].r,val=aval[i][j].id;
c(1,1,n,x,val);
}
for(int j=0;j<qval[i].size();j++)
{
int x=qval[i][j].r;
ans[qval[i][j].id]=max(ans[qval[i][j].id],q(1,1,n,x,n));
}
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}