#include <bits/stdc++.h>
#define MAXN 100100
#define MAXM 2002
#define INF 0x3f3f3f3f
using namespace std;
int n,m,p[MAXN],f[MAXN][2];
string type;
bool vis[MAXM][MAXM];
vector <int> G[MAXN];
void add(int u,int v)
{
G[u].push_back(v);
G[v].push_back(u);
vis[u][v]=vis[v][u]=true;
}
void dp(int u)
{
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(v==u)
continue;
dp(v);
f[u][1]+=min(f[v][1],f[v][0])+p[i];
f[u][0]+=f[v][1];
}
}
int main()
{
scanf("%d%d",&n,&m);
cin >> type;
for(int i=1;i<=n;i++)
scanf("%d",p[i]);
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
while(m--)
{
memset(f,0,sizeof(f));
int a,x,b,y;
scanf("%d%d%d%d",&a,&x,&b,&y);
if(vis[a][b]==true && x==0 && y==0)
puts("-1 ");
else
{
int ans=0;
dp(1);
if(x==0)
p[a]=INF;
if(x==1)
p[a]=0;
if(y==0)
p[b]=INF;
if(y==1)
p[b]=0;
ans=max(f[1][1],f[1][0]);
printf("%d ",ans);
}
}
return 0;
}