#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;

const int N=5e5+5,INF=1e9;

int n,m,cnt,num,d[N],fa[N],top[N],siz[N],dep[N],son[N],dfn[N],tid[N],head[N];

struct edge{
	int to,nxt;
}e[N<<1];

void add(int u,int v){
	e[++cnt]=(edge){v,head[u]};
	head[u]=cnt;
}

void dfs1(int u,int f,int d){
	siz[u]=1,fa[u]=f,dep[u]=d;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==f) continue;
		dfs1(v,u,d+1);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
}

void dfs2(int u,int tp){
	top[u]=tp;dfn[u]=++num,tid[num]=u;
	if(!son[u]) return;
	dfs2(son[u],tp);
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}

int lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}

struct segment_tree{
	int mx[N<<2];
	
	void pushup(int p){
		mx[p]=max(mx[ls],mx[rs]);
	}
	
	void build(int p,int l,int r){
		if(l==r){
			mx[p]=dep[l];
			return;
		}
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		pushup(p);
	}
	
	int query(int p,int l,int r,int a,int b){
		if(a<=l&&b>=r) return mx[p];
		int mid=l+r>>1,res=0;
		if(a<=mid) res=max(res,query(ls,l,mid,a,b));
		else res=max(res,query(rs,mid+1,r,a,b));
		return res;
	}
}t;

struct giao{
	int mn,mx;
};

struct segment_tree1{
	giao c[N<<2];
	
	giao work(giao x,giao y){
		return (giao){min(x.mn,y.mn),max(x.mx,y.mx)};
	}
	
	void pushup(int p){
		c[p]=work(c[ls],c[rs]);
	}
	
	void build(int p,int l,int r){
		if(l==r){
//			cout<<l<<' '<<dfn[l]<<endl;
			c[p].mx=c[p].mn=dfn[l];
			return;
		}
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		pushup(p);
	}
	
	giao query(int p,int l,int r,int a,int b){
//		cout<<l<<' '<<r<<' '<<c[p].mn<<' '<<c[p].mx<<" "<<a<<' '<<b<<endl;
		if(a<=l&&b>=r) return c[p];
		int mid=l+r>>1;
		giao res=(giao){INF,0};
		if(a<=mid) res=work(res,query(ls,l,mid,a,b));
		if(b>mid) res=work(res,query(rs,mid+1,r,a,b));
		return res;
	}
}t1;

bool check(){
	for(int i=1;i<=n;i++)
		if(d[i]>2) return false;
	return true;
}

int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,x,y;i<n;i++){
		scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
		d[x]++,d[y]++;
	}
	dfs1(1,0,1),dfs2(1,1);
	if(check()){
		t.build(1,1,n);
		scanf("%d",&m);
		for(int i=1,x,y,z,l,r;i<=m;i++){
			scanf("%d%d%d",&x,&y,&z);
			l=y-z+1,r=z;
			if(l>=r) printf("%d\n",t.query(1,1,n,x,y));
			else printf("%d\n",max(t.query(1,1,n,x,l),t.query(1,1,n,r,y)));
		}
		return 0;
	}
	if(n<=5000){
//		cout<<0;
		scanf("%d",&m);
		t1.build(1,1,n);
		for(int i=1,x,y,z;i<=m;i++){
			scanf("%d%d%d",&x,&y,&z);
			int ans=1;
			for(int j=x,l,r;j+z-1<=y;j++){
				giao res=t1.query(1,1,n,j,j+z-1);
				l=tid[res.mn],r=tid[res.mx];
//				cout<<l<<' '<<r<<endl;
				ans=max(ans,dep[lca(l,r)]);
			}
			printf("%d\n",ans);
		}
		return 0;
	}
	scanf("%d",&m);
	for(int i=1,x,y,z,l,r;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		if(z==y-x+1){
			giao res=t1.query(1,1,n,x,y);
			l=tid[res.mn],r=tid[res.mx];
			printf("%d\n",dep[lca(l,r)]);
		}
	}
	return 0;
}
