#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1200010;
char __buf[1<<20],*__p1,*__p2;
#define getchar() (__p1==__p2?(__p2=__buf+fread(__p1=__buf,1,1<<20,stdin),__p1==__p2?EOF:*__p1++):*__p1++)
int read() {
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return s*w;
}
struct Qu{int l,r,LC,lc,rc,n;}Q[maxn];
int B[maxn],C[maxn],dfn[maxn],low[maxn],N,wc[maxn],d[maxn],fa[maxn][20],n,q,bl,bc,c[maxn],vc[maxn],pr[maxn],ls[maxn],rs[maxn];
char ton[maxn];vector<int>G[maxn];
bool cmp(Qu x,Qu y) {return B[x.l]==B[y.l]?B[x.l]&1?x.r<y.r:x.r>y.r:x.l<y.l;}
void add(int x,int y) {G[x].push_back(y),G[y].push_back(x);}
void Dfs(int x) {
	wc[dfn[x]=++N]=x,d[x]=d[fa[x][0]]+1;
	for(int i=0;fa[x][i];i++) fa[x][i+1]=fa[fa[x][i]][i];
	for(auto y:G[x]) if(y^fa[x][0]) fa[y][0]=x,Dfs(y);
	wc[low[x]=++N]=x;
}
int LCA(int x,int y) {
	if(d[x]<d[y]) swap(x,y);
	for(int i=19;~i;i--) if(d[fa[x][i]]>=d[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=19;~i;i--) if(fa[x][i]^fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
void ins(int x) {
	x=c[x];
	if((ton[x]^=1)) ++vc[C[x]];
	else --vc[C[x]];
}
int ask(int l,int r) {
	if(C[l]==C[r]) {
		for(int i=l;i<=r;i++) if(ton[i]) return i;
		return -1;
	}
	for(int i=l;i<=rs[C[l]];i++) if(ton[i]) return i;
	for(int i=ls[C[r]];i<=r;i++) if(ton[i]) return i;
	for(int i=C[l]+1;i<C[r];i++) if(vc[i])
		for(int j=ls[i];j<=rs[i];j++) if(ton[j]) return j;
	return -1;
}
signed main() {
	n=read(),q=read(),bl=pow(q,0.5),bc=sqrt(n);
	for(int i=1;i<=n;i++) c[i]=read(),C[i]=(i-1)/bc+1,C[i]^C[i-1]?ls[C[i]]=i:0,rs[C[i]]=i;
	for(int i=1;i<n;i++) add(read(),read());
	Dfs(1);for(int i=1;i<=N;i++) B[i]=(i-1)/bl+1;
	for(int i=1,x,y,lc;i<=q;i++) {
		lc=LCA(x=read(),y=read()),dfn[x]>dfn[y]?swap(x,y):void();
		if(lc==x||lc==y) Q[i]=(Qu){dfn[x],dfn[y],0,read(),read(),i};
		else Q[i]=(Qu){low[x],dfn[y],lc,read(),read(),i};
	}
	sort(Q+1,Q+1+q,cmp);
	int L=1,R=0;
	for(int i=1;i<=q;i++) {
		while(R<Q[i].r) ins(wc[++R]);
		while(Q[i].l<L) ins(wc[--L]);
		while(R>Q[i].r) ins(wc[R--]);
		while(Q[i].l>L) ins(wc[L++]);
		if(Q[i].LC) ins(Q[i].LC);
		pr[Q[i].n]=ask(Q[i].lc,Q[i].rc);
		if(Q[i].LC) ins(Q[i].LC);
	}
	for(int i=1;i<=q;i++) cout<<pr[i]<<'\n';
	return 0;
}