#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;
const int N=3e5+7;
mt19937_64 Rand(355);
inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
return x*f;
}
int n,q,idx;
int col[N];
ull key[N*40];
int dep[N],top[N],fa[N],root[N],bigson[N],siz[N];
int head[N<<1],cnt;
struct node{
ull sum,key;
int ls,rs;
}tr[N*40];
struct edge{
int to,next;
}e[N<<1];
inline void newnode(int pos,int pre){
tr[pos] = tr[pre];
}
inline void addedge(int from,int to){
e[++cnt]=(edge){to,head[from]};
head[from]=cnt;
}
inline int query(int a,int b,int c,int d,int l,int r,int L,int R){
if(!(tr[a].sum^tr[b].sum^tr[c].sum^tr[d].sum))return -1;
if(l==r)return l;
int mid=(l+r)>>1,ret=-1;
if(l<=mid){
ret = query(tr[a].ls,tr[b].ls,tr[c].ls,tr[d].ls,l,mid,L,R);
if(ret!=-1)return ret;
}
if(r>mid){
ret = query(tr[a].rs,tr[b].rs,tr[c].rs,tr[d].rs,mid+1,r,L,R);
if(ret!=-1)return ret;
}
return -1;
}
inline void insert(int pos,int pre,int l,int r,int wz,ull val){
newnode(pos,pre);
tr[pos].sum^=val;
if(l==r)return;
int mid=(l+r)>>1;
if(wz <= mid)insert(tr[pos].ls,tr[pos].rs,l,mid,wz,val);
else insert(tr[pos].rs,tr[pos].rs,mid+1,r,wz,val);
}
inline void dfs1(int x){
insert(root[x],root[fa[x]],1,n,col[x],tr[col[x]].key);
siz[x]=1;
for(int i=head[x];i;i=e[i].next){
int to=e[i].to;
if(to == fa[x])continue;
dep[to] = dep[x] + 1;
fa[to] = x;
dfs1(to);
siz[x] += siz[to];
if(siz[x] > siz[bigson[x]])
bigson[x] = to;
}
}
inline void dfs2(int x){
if(bigson[x]){
top[bigson[x]] = top[x];
dfs2(bigson[x]);
}
for(int i=head[x];i;i=e[i].next){
int to=e[i].to;
if(to == fa[x] || to == bigson[x])continue;
top[to] = to;
dfs2(to);
}
}
inline int lca(int u,int v){
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]] )std::swap(u,v);
u = fa[top[u]];
}
if(dep[u] < dep[v])std::swap(u,v);
return v;
}
int main(){
n=read();
q=read();
for(int i=1;i<=n;i++){
col[i]=read();
tr[i].key=Rand();
}
for(int i=1;i<n;i++){
int u=read(),v=read();
addedge(u,v);
addedge(v,u);
}
dfs1(1);
top[1]=1;
dfs2(1);
while(q--){
int u=read(),v=read(),l=read(),r=read();
int LCA=lca(u,v);
printf("%d\n",query(root[u],root[v],root[LCA],root[fa[LCA]],1,n,l,r));
}
return 0;
}