#include<bits/stdc++.h>
using namespace std;
struct SEG1{
struct st{
int l,r,c;
}a[1048888];
void bt(int x,int l,int r){
a[x].l=l;
a[x].r=r;
a[x].c=1e9;
if(l<r){
bt(x<<1,l,(l+r>>1));
bt(x<<1|1,(l+r>>1)+1,r);
}
}
void px(int x,int p,int v){
a[x].c=min(a[x].c,v);
if(a[x].l==a[x].r) return;
int mid=a[x].l+a[x].r>>1;
if(p<=mid) px(x<<1,p,v);
else px(x<<1|1,p,v);
}
int que(int x,int l,int r){
if(a[x].l==l&&a[x].r==r) return a[x].c;
int mid=a[x].l+a[x].r>>1;
if(r<=mid) return que(x<<1,l,r);
if(l>mid) return que(x<<1|1,l,r);
return min(que(x<<1,l,mid),que(x<<1|1,mid+1,r));
}
}T1;
struct SEG2{
struct st{
int l,r,c;
}a[1048888];
void bt(int x,int l,int r){
a[x].l=l;
a[x].r=r;
a[x].c=0;
if(l<r){
bt(x<<1,l,(l+r>>1));
bt(x<<1|1,(l+r>>1)+1,r);
}
}
void px(int x,int p,int v){
a[x].c=max(a[x].c,v);
if(a[x].l==a[x].r) return;
int mid=a[x].l+a[x].r>>1;
if(p<=mid) px(x<<1,p,v);
else px(x<<1|1,p,v);
}
int que(int x,int l,int r){
if(a[x].l==l&&a[x].r==r) return a[x].c;
int mid=a[x].l+a[x].r>>1;
if(r<=mid) return que(x<<1,l,r);
if(l>mid) return que(x<<1|1,l,r);
return max(que(x<<1,l,mid),que(x<<1|1,mid+1,r));
}
}T2;
int n,m,a[500005],d[500005],dfn[500005],st[22][500005],dcnt,l[500005],r[500005],k[500005],ans[500005],N,o[500005],top;
struct op{
int l,r,k,v;
}c[1500006];
vector<int>e[500005];
void dfs(int x,int f){
st[0][dfn[x]=++dcnt]=f;
d[x]=d[f]+1;
for(int i:e[x]) if(i!=f) dfs(i,x);
}
int gt(int x,int y){
return dfn[x]<dfn[y]?x:y;
}
int lca(int x,int y){
x=dfn[x],y=dfn[y];
if(x>y) swap(x,y);
int k=__lg(y-x);
return gt(st[k][x+1],st[k][y-(1<<k)+1]);
}
namespace IO{
const int N=1<<20;
char buf[N+5],*p=buf,*q=buf,qw[N+5];
int bc;
char getc(){
if(p==q) p=buf,q=buf+fread(buf,1,N,stdin);
return *p++;
}
void fls(){
fwrite(qw,1,bc,stdout),bc=0;
}
void pc(char a){
qw[bc++]=a;
if(bc==N) fls();
}
}
using IO::getc;
using IO::pc;
void rd(int&x){
char c=getc();
for(x=0;c>'9'||c<'0';c=getc());
for(;c<='9'&&c>='0';c=getc()) x=x*10+(c^48);
}
void wt(int x){
if(x>9) wt(x/10);
pc(x%10+48);
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
rd(n);
for(int i=1,u,v;i<n;i++){
rd(u),rd(v);
e[u].push_back(v);
e[v].push_back(u);
}
rd(m);
dfs(1,0);
for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++) st[i][j]=gt(st[i-1][j],st[i-1][j+(1<<(i-1))]);
T1.bt(1,1,n-1);
T2.bt(1,1,n);
for(int i=1;i<=n;i++) T2.px(1,i,d[i]);
for(int i=1;i<n;i++) a[i]=d[lca(i,i+1)],T1.px(1,i,a[i]);
for(int i=1;i<=m;i++){
rd(l[i]),rd(r[i]),rd(k[i]);
r[i]--,k[i]--;
if(k[i]) c[++N]={l[i],r[i]-k[i]+1,k[i],i},ans[i]=T1.que(1,l[i],l[i]+k[i]-1);
else ans[i]=T2.que(1,l[i],r[i]+1);
}
for(int i=1;i<=n;i++){
while(top&&a[o[top]]>a[i]){
c[++N]={o[top-1]+1,0,i-o[top-1]-1,a[o[top]]};
top--;
}
o[++top]=i;
}
T2.bt(1,1,n);
sort(c+1,c+N+1,[&](op x,op y){return x.k==y.k?x.r<y.r:x.k>y.k;});
for(int i=1;i<=N;i++){
if(c[i].r) ans[c[i].v]=max(ans[c[i].v],T2.que(1,c[i].l,c[i].r));
else T2.px(1,c[i].l,c[i].v);
}
for(int i=1;i<=m;i++) wt(ans[i]),pc('\n');
IO::fls();
}