#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
struct matrix{
long long a[5][5];
matrix() {
for (int i =0 ;i< 5; i++) for (int j = 0; j < 5; j++) a[i][j] = -1e18;
}
};
matrix nhan(matrix &x,matrix &y) {
matrix z;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
for (int k = 0; k < 5; k++) {
z.a[i][j] = max(z.a[i][j],x.a[i][k]+y.a[k][j]);
}
}
}
return z;
}
long long par[20][N];
matrix f[20][N],f2[20][N];
long long n;
long long blue[N],red[N];
long long h[N];
vector<long long> g[N];
void dfs(long long u,long long p = -1) {
if (p == -1) {
h[u] = 1;
par[0][u] = u;
} else {
h[u] = h[p]+1;
par[0][u] = p;
}
for (auto v:g[u]) if (v != p) dfs(v,u);
}
long long getLca(long long u,long long v) {
if (h[u] < h[v]) swap(u,v);
long long delta = h[u]-h[v];
for (int i = 0; i < 20; i++) {
if ((delta >> i)&1) {
u = par[i][u];
}
}
if (u == v) return u;
for (int i = 19; i >= 0; i--){
if (par[i][u] != par[i][v]) {
u = par[i][u];
v = par[i][v];
}
}
return par[0][u];
}
long long q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++ ){
cin >> red[i];
}
for (int i = 1; i<= n; i++) {
cin >> blue[i];
}
for (int i = 1; i < n; i++) {
long long u,v;
cin>> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
g[0].push_back(1);
dfs(0);
for (int i = 0; i <= n; i++) {
for (int j = 0; j < 5; j++) {
if (j-1 >= 0) {
f[0][i].a[j][j-1] = blue[i];
}
if (j+1 < 5) {
f[0][i].a[j][j+1] = red[i];
}
}
f2[0][i] = f[0][i];
}
for(int i = 1; i < 20; i++){
for(int j = 0; j <= n; j++){
long long nex = par[i-1][j];
par[i][j] = par[i-1][nex];
f[i][j] = nhan(f[i-1][j],f[i-1][nex]);
f2[i][j] = nhan(f2[i-1][nex],f2[i-1][j]);
}
}
while(q--) {
long long u,v;
cin >> u >> v;
long long p = getLca(u,v);
matrix res,res2;
res.a[2][2] = 0;
long long delta = h[u]-h[p];
for (int i = 19; i >= 0; i--) {
if (!((delta >> i)&1)) continue;
res = nhan(res,f[i][u]);
u = par[i][u];
}
res = nhan(res,f[0][p]);
bool f = true;
long long del = h[v]-h[p];
for (int i = 19; i >= 0; i--) {
if (!((del >> i)&1)) {
continue;
}
if (f) res2 = f2[i][v];
else res2 = nhan(f2[i][v],res2);
v = par[i][v];
f = false;
}
if (del != 0) res = nhan(res,res2);
long long ans = -1e18;
for (int i = 0; i < 5; i++) ans = max(ans,res.a[2][i]);
cout << ans << "\n";
}
}