#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=2e7+5;
struct tr{
int dy[N];
struct node{
int l,r,sm;
}p[N<<2];
void upset(int x){
p[x].sm=max(p[x<<1].sm,p[x<<1|1].sm);
}
void reset(int x,int l,int r){
p[x].l=l,p[x].r=r;
if(l==r){
dy[l]=x;
return;
}
int mid=l+r>>1;
reset(x<<1,l,mid);
reset(x<<1|1,mid+1,r);
}
void sets(int x,int d,int sm){
x=dy[d];
if(sm<=p[x].sm)return;
p[x].sm=max(p[x].sm,sm);
while(x!=1){
x>>=1;
int tmp=p[x].sm;
upset(x);
if(tmp==p[x].sm)return;
}
}
int gets(int x,int l,int r){
if(l>r)return 0;
if(l<=p[x].l&&r>=p[x].r)return p[x].sm;
int mid=p[x].l+p[x].r>>1;
if(r<=mid)return gets(x<<1,l,r);
if(l>mid)return gets(x<<1|1,l,r);
return max(gets(x<<1,l,r),gets(x<<1|1,l,r));
}
}q1,q2;
int n,dep[N],fa[N],dfn[N],dys[N],eds[N],tot,cnt,nw,mk[N],ds[N][20],st[N][20],lg2[N],siz[N],rs[N],m,jl[N<<2],idx,hd[N],lst[M];
struct node{
int lst,nxt;
}f[N];
struct ask{
int l,r,bh;
};
struct msg{
int l,r,sm;
}val[M];
vector<ask>g[N];
vector<int>p[N];
vector<msg>q[N];
void add(int x,msg sm){
val[++cnt]=sm;
lst[cnt]=hd[x];
hd[x]=cnt;
}
int gmax(int a,int b){
if(dep[a]<dep[b])return a;
return b;
}
void dfs(int x){
dfn[x]=++tot;dys[tot]=x;
mk[x]=1;siz[x]=1;
for(int i=0;i<p[x].size();i++){
int c=p[x][i];
if(mk[c]){
p[x].erase(p[x].begin()+i);
i--;
continue;
}
fa[c]=x;
dep[c]=dep[x]+1;
dfs(c);
siz[x]+=siz[c];
}
mk[x]=0;eds[x]=tot;
}
int lca(int a,int b){
if(dfn[a]>dfn[b])swap(a,b);
if(a==b)return a;
int l=dfn[a]+1,r=dfn[b],k=lg2[r-l+1];
return fa[gmax(ds[l][k],ds[r-(1<<k)+1][k])];
}
void clr(){
while(idx){
int c=jl[idx--];
f[c]={c-1,c+1};
}
}
void del(int x){
jl[++idx]=f[x].lst;
jl[++idx]=f[x].nxt;
f[f[x].lst].nxt=f[x].nxt;
f[f[x].nxt].lst=f[x].lst;
add(f[x].nxt-f[x].lst-1,{f[x].lst+1,f[x].nxt-1,nw});
}
void solve(int x){
for(auto c:p[x]){
solve(c);
if(c!=p[x].back())clr();
}
nw=dep[x];
del(x);
for(auto c:p[x]){
if(c==p[x].back())continue;
for(int i=dfn[c];i<=eds[c];i++)del(dys[i]);
}
}
int gets(int l,int r){
int k=lg2[r-l+1];
return lca(st[l][k],st[r-(1<<k)+1][k]);
}
inline int read(){
int x=0;char c;
do{
c=getchar();
}while(!isdigit(c));
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x;
}
void wr(int x){
if(x>9)wr(x/10);
putchar(x%10+'0');
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)lg2[i]=__lg(i);
for(int i=1;i<n;i++){
int x=read(),y=read();
p[x].push_back(y);
p[y].push_back(x);
}
cin>>m;
for(int i=1;i<=m;i++){
int l=read(),r=read(),k=read();
g[k].push_back({l,r,i});
}
dep[1]=1;
dfs(1);
for(int i=1;i<=n;i++)ds[i][0]=dys[i];
for(int i=1;i<=19;i++){
for(int j=1;j<=n-(1<<i)+1;j++){
ds[j][i]=gmax(ds[j][i-1],ds[j+(1<<i-1)][i-1]);
}
}
for(int i=1;i<=n;i++)st[i][0]=i;
for(int i=1;i<=19;i++){
for(int j=1;j<=n-(1<<i)+1;j++){
st[j][i]=lca(st[j][i-1],st[j+(1<<i-1)][i-1]);
}
}
for(int i=1;i<=n;i++)sort(p[i].begin(),p[i].end(),[&](int a,int b){
return siz[a]<siz[b];
});
for(int i=1;i<=n;i++)f[i]={i-1,i+1};
solve(1);
q1.reset(1,1,n);q2.reset(1,1,n);
for(int i=n;i>=1;i--){
for(int j=hd[i];j;j=lst[j]){
auto c=val[j];
q1.sets(1,c.l,c.sm);
q2.sets(1,c.r,c.sm);
}
for(auto c:g[i]){
rs[c.bh]=max({dep[gets(c.l,c.r)],q2.gets(1,c.l+i-1,c.r),q1.gets(1,c.l,c.r-i+1)});
}
}
for(int i=1;i<=m;i++){
wr(rs[i]);
putchar('\n');
}
}