#include<bits/stdc++.h>
#define up(i,l,r) for(int i=(l);i<=(r);++i)
#define down(i,l,r) for(int i=(l);i>=(r);--i)
#define pi pair<int,int>
#define p1 first
#define p2 second
#define m_p make_pair
#define p_b push_back
typedef long long ll;
using namespace std;
const int maxn=5e5+10,mod=1e9+7;
inline ll read(){
ll x=0;short t=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*t;
}
int n,q,siz[maxn],son[maxn],dfn[maxn],idfn[maxn],ct,fa[maxn],dep[maxn];
int res[maxn];
vector<pi>A[maxn];
vector<int>E[maxn];
struct nd {
int l,r,k,id;
}d[maxn],ql[maxn],qr[maxn];
struct ODT {
set<pi>s;
void upd(int x,int d){
auto it=s.lower_bound(m_p(x,0));
int ml=x,mr=x;vector<pi>del;
if(it!=s.end()){if((*it).p1==x+1)del.p_b(*it),mr=(*it).p2;}
if(it!=s.begin()){--it;if((*it).p2==x-1)del.p_b(*it),ml=(*it).p1;}
for(auto it:del)s.erase(it);
s.insert(m_p(ml,mr));A[d].p_b(m_p(ml,mr));
}
void clear(){s.clear();}
}T;
void dfs(int u){
dep[u]=dep[fa[u]]+1;
siz[u]=1,dfn[u]=++ct,idfn[ct]=u;
for(int x:E[u])if(x!=fa[u])fa[x]=u,dfs(x),siz[u]+=siz[x];
for(int x:E[u])if(x!=fa[u]&&siz[x]>siz[son[u]])son[u]=x;
}
void ins(int u,int d){
up(i,dfn[u],dfn[u]+siz[u]-1){
int x=idfn[i];
T.upd(x,d);
}
}
void dfs2(int u){
for(int x:E[u])if(x!=fa[u]&&x!=son[u])dfs2(x),T.clear();
if(son[u])dfs2(son[u]);
for(int x:E[u])if(x!=fa[u]&&x!=son[u])ins(x,dep[u]);
T.upd(u,dep[u]);
}
int len[maxn];
struct st {
int t[maxn][20],Log_2[maxn];
void init(int n){
up(i,2,n+1)Log_2[i]=Log_2[i>>1]+1;
up(i,0,n)t[i][0]=len[i];
up(i,1,Log_2[n+1])up(j,0,n-(1<<i)+1)t[j][i]=max(t[j][i-1],t[j+(1<<i-1)][i-1]);
}int qry(int l,int r){if(l>r)return -1;
int k=Log_2[r-l+1];
return max(t[l][k],t[r-(1<<k)+1][k]);
}
}st;
bool cmp(pi a,pi b){
if(a.p1!=b.p1)return a.p1<b.p1;
return a.p2>b.p2;
}
void calc(int l,int r,int p,int q){
if(l>r||p>q)return;
if(p==q){
up(i,l,r)res[d[i].id]=p;
return;
}int mid=p+q>>1;
vector<pi>R,R2;
up(i,mid+1,q)for(auto it:A[i])R.p_b(m_p(it.p1,it.p2));
sort(R.begin(),R.end(),cmp);
int mx=0;for(auto it:R){
if(it.p2<=mx)continue;
R2.p_b(it),mx=it.p2;
}R.swap(R2);int L=R.size();
up(i,0,L-1)len[i]=R[i].p2-R[i].p1+1;
st.init(L-1);
int q1=0,q2=0;
up(i,l,r){
int l=d[i].l,r=d[i].r,mx=0;
auto it=lower_bound(R.begin(),R.end(),m_p(l,0));
if(it!=R.begin()){--it;if((*it).p2>=l)mx=max(mx,min((*it).p2,r)-l+1);++it;}
int p=it-R.begin();
auto it2=lower_bound(R.begin(),R.end(),m_p(r+1,0));
if(it2!=R.begin()){
--it2;int q=it2-R.begin();
if((*it2).p2>r){
--q;mx=max(mx,r-max((*it2).p1,l)+1);
}
if(p<L)mx=max(mx,st.qry(p,q));
}
if(mx<d[i].k)ql[++q1]=d[i];
else qr[++q2]=d[i];
}
up(i,l,l+q1-1)d[i]=ql[i-l+1];
up(i,l+q1,r)d[i]=qr[i-l-q1+1];
calc(l,l+q1-1,p,mid);calc(l+q1,r,mid+1,q);
}
void slv(){
n=read();
up(i,1,n-1){
int x=read(),y=read();
E[x].p_b(y),E[y].p_b(x);
}dfs(1);dfs2(1);
q=read();up(i,1,q)d[i].l=read(),d[i].r=read(),d[i].k=read(),d[i].id=i;
calc(1,q,1,n);
up(i,1,q)printf("%d\n",res[i]);
}int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
slv();
fclose(stdin);
fclose(stdout);
return 0;
}