/*
暴力枚举选哪几条路径
*/
#include<bits/stdc++.h>
#define N 100007
#define ll long long
using namespace std;
ll n,m,ans,cnt,flag,cur;
ll head[N],deep[N],sum[N],f[N][28];
ll vis[N],choose[N],W[N];
struct edge{
ll u,v,net;
}e[N<<1];
struct node{
int pos,x,y;
}p[N];
inline ll read()
{
int x=0,f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
inline ll max(ll a,ll b){return a>b?a:b;}
inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].net=head[u];head[u]=cnt;
}
void DFS(int u,int fa,int c)
{
f[u][0]=fa;deep[u]=c;
for(int i=head[u];i;i=e[i].net)
{
int v=e[i].v;
if(v==fa) continue;
sum[v]+=sum[u];
DFS(v,u,c+1);
}
}
void get()
{
for(int j=1;j<=27;j++) for(int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
}
int lca(int a,int b)
{
if(deep[a]<deep[b]) swap(a,b);
int t=deep[a]-deep[b];
for(int i=0;i<=26;i++)
if(t&(1<<i)) a=f[a][i];
if(a==b) return a;
for(int i=26;i>=0;i--)
if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
return f[a][0];
}
ll S(ll a,ll b)
{
int res=lca(a,b);
return sum[a]+sum[b]-2*sum[res]+W[res];
}
void expand(int i)
{
int x=p[i].x,y=p[i].y,res=lca(x,y);
if(vis[res]) {flag=1;return;}
while(x!=res)
{
if(vis[x])
{flag=1;break;}
vis[x]=1;x=f[x][0];
}
while(y!=res){if(vis[y]){vis[y]=2;flag=1;}else vis[y]=1;y=f[y][0];}vis[res]=1;
}
void clear(int i)
{
int x=p[i].x,y=p[i].y,res=lca(x,y);
if(x==res && vis[x]) vis[x]--;
if(y==res && vis[y]) vis[y]--;
while(x!=res){vis[x]=0;x=f[x][0];}
while(y!=res){if(vis[y])vis[y]--;y=f[y][0];}if(x!=res && y!=res)vis[res]--;
}
void dfs(int k,int tot,int lim)
{
if(tot==lim)
{
flag=0,cur=0;
memset(vis,0,sizeof vis);
for(int i=1;i<=m;i++)
{
if(choose[i])
{
expand(i);
if(flag) return;
else cur+=S(p[i].x,p[i].y);
}
}
ans=max(ans,cur);
return;
}
for(int i=k;i<=m;i++)
{
if(choose[i]) continue;
choose[i]=1;dfs(i+1,tot+1,lim);
choose[i]=0;
clear(i);
}
}
int main()
{
freopen("ly.in","r",stdin);
int x,y;
n=read();
for(int i=1;i<=n;i++) W[i]=sum[i]=read();
for(int i=1;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
}
DFS(1,1,0);get();
m=read();
for(int i=1;i<=m;i++)
{
p[i].x=read();p[i].y=read();p[i].pos=i;
ans=max(ans,S(p[i].x,p[i].y));
}
for(int i=1;i<=n/2;i++)
{
memset(choose,0,sizeof choose);
memset(vis,0,sizeof vis);
dfs(1,0,i);
}
printf("%lld
",ans);
return 0;
}
/*
10
1 2 3 4 5 6 7 8 9 10
10 6
9 6
3 1
6 7
6 3
3 8
8 5
8 4
2 6
4
2 3
3 4
4 5
9 1
*/