#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int N=500005,M=25;
int n,q,ee,a[N],vex[N],depp[N],f[N][M];
int t[N*4],tl[N*4],tr[N*4];
int ql[N],qr[N],ans[N],st[N][M],lgg[N];
bool tagl[N*4],tagr[N*4];
vector<int>qq[N],vec1[N],vec2[N],vec3[N];
int stkk[N],topp,posl[N],posr[N];
struct Node{
int u,v,next;
}e[N*2];
void add(int u,int v){
e[++ee].u=u,e[ee].v=v;
e[ee].next=vex[u],vex[u]=ee;
}
void dfs(int u,int fa){
depp[u]=depp[fa]+1;
f[u][0]=fa;
for(int i=1;i<=20;i++){
f[u][i]=f[f[u][i-1]][i-1];
}
for(int i=vex[u];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
dfs(v,u);
}
}
int lca(int u,int v){
if(depp[u]<depp[v])swap(u,v);
for(int i=20;i>=0;i--){
if(depp[f[u][i]]<depp[v])continue;
u=f[u][i];
}
if(u==v)return u;
for(int i=20;i>=0;i--){
if(f[u][i]==f[v][i])continue;
u=f[u][i],v=f[v][i];
}
return f[u][0];
}
void getst(){
for(int i=1;i<=n;i++){
st[i][0]=depp[i];
}
for(int i=2;i<=n;i++){
lgg[i]=lgg[i>>1]+1;
}
for(int j=1;j<=lgg[n];j++){
for(int i=1;i+(1<<j)-1<=n;i++){
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
}
int askst(int l,int r){
int k=lgg[r-l+1];
return max(st[l][k],st[r-(1<<k)+1][k]);
}
void up(int p){
if(t[p*2]==0&&t[p*2+1]==0){
t[p]=0;
}
else if(t[p*2]==0){
t[p]=t[p*2+1];
tl[p]=tl[p*2+1];
tr[p]=tr[p*2+1];
tagl[p]=tagl[p*2+1];
tagr[p]=tagr[p*2+1];
}
else if(t[p*2+1]==0){
t[p]=t[p*2];
tl[p]=tl[p*2];
tr[p]=tr[p*2];
tagl[p]=tagl[p*2];
tagr[p]=tagr[p*2];
}
else{
t[p]=max(t[p*2],t[p*2+1]);
tl[p]=tl[p*2];
tagl[p]=tagl[p*2];
tr[p]=tr[p*2+1];
tagr[p]=tagr[p*2+1];
}
}
int calc(int now,int x,bool flag){
if(!flag)return x;
else return x-now;
}
void build(int p,int l,int r){
if(l==r){
t[p]=a[l];
tl[p]=l+1,tagl[p]=1;
tr[p]=r,tagr[p]=0;
return;
}
int mid=(l+r)>>1;
build(p*2,l,mid),build(p*2+1,mid+1,r);
up(p);
}
void upd1(int p,int l,int r,int x,int val){
if(l==r){
tl[p]=val,tagl[p]=0;
return;
}
int mid=(l+r)>>1;
if(x<=mid)upd1(p*2,l,mid,x,val);
else upd1(p*2+1,mid+1,r,x,val);
up(p);
}
void upd2(int p,int l,int r,int x,int val){
if(l==r){
tr[p]=val,tagr[p]=1;
return;
}
int mid=(l+r)>>1;
if(x<=mid)upd2(p*2,l,mid,x,val);
else upd2(p*2+1,mid+1,r,x,val);
up(p);
}
void upd3(int p,int l,int r,int x){
if(l==r){
t[p]=0;
return;
}
int mid=(l+r)>>1;
if(x<=mid)upd3(p*2,l,mid,x);
else upd3(p*2+1,mid+1,r,x);
up(p);
}
int ask(int p,int l,int r,int xl,int xr,int now){
if(!t[p])return 0;
int posl=calc(now,tl[p],tagl[p]);
int posr=calc(now,tr[p],tagr[p]);
if(posr<xl||posl>xr)return 0;
if(l==r)return t[p];
if(xl<=posl&&posr<=xr)return t[p];
int mid=(l+r)>>1;
return max(ask(p*2,l,mid,xl,xr,now),ask(p*2+1,mid+1,r,xl,xr,now));
}
void getpos(){
for(int i=1;i<=n;i++){
while(topp&&a[i]<a[stkk[topp]])topp--;
posl[i]=stkk[topp];
stkk[++topp]=i;
}
topp=0;
stkk[topp]=n+1;
for(int i=n;i>=1;i--){
while(topp&&a[i]<=a[stkk[topp]])topp--;
posr[i]=stkk[topp];
stkk[++topp]=i;
}
}
void solve(){
n--;
build(1,1,n);
getpos();
for(int i=1;i<=n;i++){
int l=posl[i],r=posr[i];
vec1[i-l].push_back(i);
vec2[r-i].push_back(i);
vec3[r-l].push_back(i);
}
for(int i=1;i<=n;i++){
int tmp=vec1[i].size();
for(int j=0;j<tmp;j++){
int x=vec1[i][j];
upd1(1,1,n,x,posl[x]+1);
}
tmp=vec2[i].size();
for(int j=0;j<tmp;j++){
int x=vec2[i][j];
upd2(1,1,n,x,x+i);
}
tmp=vec3[i].size();
for(int j=0;j<tmp;j++){
int x=vec3[i][j];
upd3(1,1,n,x);
}
tmp=qq[i].size();
for(int j=0;j<tmp;j++){
int id=qq[i][j];
int l=ql[id],r=qr[id];
ans[id]=ask(1,1,n,l,r,i);
}
}
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v),add(v,u);
}
dfs(1,0);
getst();
for(int i=1;i<n;i++){
a[i]=depp[lca(i,i+1)];
}
q=read();
for(int i=1;i<=q;i++){
int l=read(),r=read(),k=read();
if(k==1){
ans[i]=askst(l,r);
}
else{
ql[i]=l,qr[i]=r-k+1;
qq[k-1].push_back(i);
}
}
if(n>1)solve();
for(int i=1;i<=q;i++){
printf("%d\n",ans[i]);
}
return 0;
}