#include <iostream>
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N = 1e5 + 5 ;
int n , q , c[N] , p[N] ;
pair<int,int> Q[N] ;
vector<int> g[N] ;
namespace sub1
{
int dist[N] ;
void bfs(int start)
{
for(int i = 1 ; i <= n ; i ++)
{
dist[i] = 1e9 ;
}
queue<int> q ;
dist[start] = 0 ;
q.push(start) ;
while(q.empty() == false)
{
int u = q.front() ;
q.pop() ;
for(int v : g[u])
{
if(dist[v] == 1e9)
{
dist[v] = dist[u] + 1 ;
q.push(v) ;
}
}
}
}
vector<int> luu ;
int mark[N] ;
int ans = -1e18 ;
void ql(int pos)
{
if(pos > luu.size() - 1)
{
int cur_0 = 0 ;
int cur_1 = 0 ;
for(int i = 0 ; i <= luu.size() - 1 ; i ++)
{
if(mark[luu[i]] == 0) cur_0 ++ ;
else cur_1 ++ ;
if(abs(cur_0 - cur_1) >= 3) return ;
}
int tong = 0 ;
for(int i = 0 ; i <= luu.size() - 1 ; i ++ )
{
if(mark[luu[i]] == 0)
{
tong += c[luu[i]] ;
}
else
{
tong += p[luu[i]] ;
}
}
ans = max(ans , tong) ;
return ;
}
for(int i = 0 ; i <= 1 ; i ++ )
{
mark[luu[pos]] = i ;
ql(pos + 1) ;
}
}
void solve()
{
for(int i = 1 ; i <= q ; i ++ )
{
int bdau = Q[i].first ;
int kthuc = Q[i].second ;
bfs(kthuc) ;
luu.push_back(bdau) ;
int cur = bdau ;
while(cur != kthuc)
{
for(int next : g[cur])
{
if(dist[next] + 1 == dist[cur])
{
cur = next ;
luu.push_back(cur) ;
break ;
}
}
}
ql(0) ;
cout<<ans<<endl ;
ans = -1e18 ;
luu.clear() ;
memset(mark , 0 , sizeof(mark)) ;
}
}
}
signed main()
{
ios::sync_with_stdio(0) ;
cin.tie(0) ; cout.tie(0) ;
cin>>n>>q;
for(int i = 1 ; i <= n ; i ++ )
{
cin>>c[i] ;
}
for(int i = 1 ; i <= n ; i ++)
{
cin>>p[i] ;
}
for(int i = 1 ; i <= n - 1 ; i ++)
{
int u , v ;
cin>>u>>v;
g[u].push_back(v) ;
g[v].push_back(u) ;
}
for(int i = 1 ; i <= q ; i ++ )
{
cin>>Q[i].first>>Q[i].second;
}
if(n <= 15 && q <= 15) return sub1::solve() , 0 ;
return 0;
}