#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define maxn 1005
#define mi LLONG_MIN
#define ma LLONG_MAX
#define mod 1000000007
#define pb push_back
#define S second
#define F first
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q;
vector<int> b(n), r(n);
for (int i = 0; i < n; i++)
{
cin >> b[i];
}
for (int i = 0; i < n; i++)
{
cin >> r[i];
}
vector<vector<int>> g(n);
for (int i = 0; i < n - 1; i++)
{
int u, v;
cin >> u >> v;
u--;
v--;
g[u].pb(v);
g[v].pb(u);
}
while (q--)
{
int x, y;
cin >> x >> y;
x--;
y--;
vector<int> dist(n, ma);
dist[x] = 0;
vector<int> p(n);
p[x] = -1;
priority_queue<pair<int, int>> q;
q.push({0, x});
vector<bool> used(n);
while (!q.empty())
{
int v = q.top().S, c = -q.top().F;
q.pop();
if (dist[v] < c)
{
continue;
}
for (auto it : g[v])
{
if (dist[it] > c + 1)
{
dist[it] = c + 1;
p[it] = v;
q.push({-c - 1, it});
}
}
}
vector<int> path;
int par = y;
while (par != -1)
{
path.pb(par);
par = p[par];
}
vector<int> bc, rc;
for (auto it : path)
{
bc.pb(b[it]);
rc.pb(r[it]);
}
sort(bc.begin(), bc.end(), greater<>());
sort(rc.begin(), rc.end(), greater<>());
vector<int> allc;
for (int i = 0; i < (bc.size() + 2) / 2; i++)
{
allc.pb(bc[i]);
allc.pb(rc[i]);
}
int ans = 0;
sort(allc.begin(), allc.end(), greater<>());
for (int i = 0; i < path.size(); i++)
{
ans += allc[i];
}
cout << ans << endl;
}
}