#include <bits/stdc++.h>
#define ll long long
using namespace std;
int N;
int A[300001], F[300001], MIN[300001];
vector <int> VG[300001];
int pos, ET[300002];
void ETDFS(int node, int parent = 0)
{
ET[++pos] = node;
for(int x : VG[node]) if(x != parent) ETDFS(x, node);
return;
}
ll DPC[300002];
void Chain()
{
for(int i = 1; i <= N; i++) if(VG[i].size() > min(2, i)) return;
ETDFS(1);
ET[++pos] = N + 1;
int r = N, r0, k = 0;
set <pair <ll, int>> SET;
DPC[ET[N]] = MIN[A[ET[N]] + 1];
SET.insert({MIN[A[ET[N]] + 1], N});
for(int i = N - 1; i; i--)
{
DPC[ET[i]] = MIN[A[ET[i]] + 1] + DPC[ET[i + 1]];
// if(A[ET[i + 1]] && ((A[ET[i]] + 1) != A[ET[i + 1]]))
// {
// r = i;
// k = 0;
// SET.clear();
// }
// else if(!A[ET[i + 1]])
// {
// if(!k)
// {
// k = A[ET[i]] + 1;
// SET.clear();
// for(int j = i + 1; j <= r; j++)
// {
// if(A[ET[j]] >= k) {r = j - 1; break;}
// SET.insert({F[k] + DPC[ET[j + 1]], j});
// }
// }
// else if(k != (A[ET[i]] + 1))
// {
// k = A[ET[i]] + 1;
// SET.clear();
// for(int j = i + 1; j <= r0; j++)
// {
// if(A[ET[j]] >= k) {r = j - 1; break;}
// SET.insert({F[k] + DPC[ET[j + 1]], j});
// }
// }
// else if(k == (A[ET[i]] + 1))
// {
// for(int j = i + 1; j <= r0; j++)
// {
// SET.erase(SET.find({MIN[A[ET[j]] + 1] + DPC[ET[j + 1]], j}));
// SET.insert({F[k] + DPC[ET[j + 1]], j});
// }
// }
// r0 = i;
// }
if(SET.size()) DPC[ET[i]] = min(SET.begin()->first, DPC[ET[i]]);
SET.insert({MIN[A[ET[i] + 1]] + DPC[ET[i + 1]], i});
}
cout << DPC[1] << '\n';
exit(0);
}
ll DP[5001][5001];
void DPDFS(int node, int parent = 0)
{
DP[0][node] = MIN[A[node] + 1];
for(int x : VG[node])
{
if(x == parent) continue;
DPDFS(x, node);
DP[0][node] += DP[0][x];
for(int k = A[node] + 1; k <= N; k++)
{
if(((A[node] + 1) % k) != A[x]) DP[k][node] += DP[0][x];
else DP[k][node] += min(DP[0][x], DP[k][x]);
}
}
for(int k = A[node] + 1; k <= N; k++) DP[0][node] = min(DP[k][node] + F[k], DP[0][node]);
return;
}
void Brute()
{
if(N > 5000) return;
DPDFS(1);
cout << DP[0][1] << '\n';
exit(0);
}
int main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N;
for(int i = 1; i <= N; i++) cin >> A[i];
for(int i = 1; i <= N; i++) cin >> F[i];
MIN[N] = F[N];
for(int i = N - 1; i; i--) MIN[i] = min(MIN[i + 1], F[i]);
int u, v;
for(int i = 1; i < N; i++)
{
cin >> u >> v;
VG[u].push_back(v);
VG[v].push_back(u);
}
Chain();
Brute();
return 0;
}