#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 200200
#define inf 1000000000
#define pb push_back
struct node
{
ll fi;
ll se;
node(int _fi = -inf, int _se = -inf)
{
fi = _fi;
se = _se;
}
void add(const node& other)
{
if(other.fi > this->fi){
this->se = this->fi;
this->fi = other.fi;
}else if(other.fi > this->se){
this->se = other.fi;
}
}
};
int n;
vector<int> adj[MAX];
bool ok[MAX];
int w[MAX];
node f[MAX];
void nhap()
{
cin >> n;
for(int i = 1; i<=n; i++) cin >> w[i];
for(int i = 1; i<=n-1; i++){
int a,b; cin >> a >> b;
adj[a].pb(b);
adj[b].pb(a);
}
memset(ok,true,sizeof(ok));
}
void pre_compute()
{
ok[1] = ok[0] = false;
for(int i = 2; i*i <=n; i++){
if(ok[i]){
for(int j = i*i; j<=n; j+= i) ok[j] = false;
}
}
}
void dfs(int v, int par)
{
f[v].se = -inf;
f[v].fi = (ok[v])? w[v] : -inf;
for(int u : adj[v]){
if(u == par) continue;
dfs(u,v);
if(f[u].fi != -inf){
// f[v].add(f[u]);
f[v].add(node(f[u].fi + w[v], f[u].se + w[v]));
}
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
nhap();
pre_compute();
dfs(1,-1);
ll res = -inf;
for(int i = 1; i<=n; i++) res = max(res, 1LL*(f[i].fi + f[i].se) - w[i]);
ll mxtmp = -inf;
for(int i = 1; i<=n; i++) if(ok[i]) mxtmp = max(mxtmp , 1LL*w[i]);
cout << max(res, mxtmp);
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgTUFYIDIwMDIwMAojZGVmaW5lIGluZiAxMDAwMDAwMDAwCiNkZWZpbmUgcGIgcHVzaF9iYWNrCgpzdHJ1Y3Qgbm9kZQp7CiAgICBsbCBmaTsKICAgIGxsIHNlOwoKICAgIG5vZGUoaW50IF9maSA9IC1pbmYsIGludCBfc2UgPSAtaW5mKQogICAgewogICAgICAgIGZpID0gX2ZpOwogICAgICAgIHNlID0gX3NlOwogICAgfQoKICAgIHZvaWQgYWRkKGNvbnN0IG5vZGUmIG90aGVyKQogICAgewogICAgICAgIGlmKG90aGVyLmZpID4gdGhpcy0+ZmkpewogICAgICAgICAgICB0aGlzLT5zZSA9IHRoaXMtPmZpOwogICAgICAgICAgICB0aGlzLT5maSA9IG90aGVyLmZpOwogICAgICAgIH1lbHNlIGlmKG90aGVyLmZpID4gdGhpcy0+c2UpewogICAgICAgICAgICB0aGlzLT5zZSA9IG90aGVyLmZpOwogICAgICAgIH0KICAgIH0KfTsKCmludCBuOwp2ZWN0b3I8aW50PiBhZGpbTUFYXTsKYm9vbCBva1tNQVhdOwppbnQgd1tNQVhdOwpub2RlIGZbTUFYXTsKCnZvaWQgbmhhcCgpCnsKICAgIGNpbiA+PiBuOwogICAgZm9yKGludCBpID0gMTsgaTw9bjsgaSsrKSBjaW4gPj4gd1tpXTsKICAgIGZvcihpbnQgaSA9IDE7IGk8PW4tMTsgaSsrKXsKICAgICAgICBpbnQgYSxiOyBjaW4gPj4gYSA+PiBiOwogICAgICAgIGFkalthXS5wYihiKTsKICAgICAgICBhZGpbYl0ucGIoYSk7CiAgICB9CiAgICBtZW1zZXQob2ssdHJ1ZSxzaXplb2Yob2spKTsKfQoKdm9pZCBwcmVfY29tcHV0ZSgpCnsKICAgIG9rWzFdID0gb2tbMF0gPSBmYWxzZTsKICAgIGZvcihpbnQgaSA9IDI7IGkqaSA8PW47IGkrKyl7CiAgICAgICAgaWYob2tbaV0pewogICAgICAgICAgICBmb3IoaW50IGogPSBpKmk7IGo8PW47IGorPSBpKSBva1tqXSA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBkZnMoaW50IHYsIGludCBwYXIpCnsKICAgIGZbdl0uc2UgPSAtaW5mOwogICAgZlt2XS5maSA9IChva1t2XSk/IHdbdl0gOiAtaW5mOwogICAgZm9yKGludCB1IDogYWRqW3ZdKXsKICAgICAgICBpZih1ID09IHBhcikgY29udGludWU7CiAgICAgICAgZGZzKHUsdik7CiAgICAgICAgaWYoZlt1XS5maSAhPSAtaW5mKXsKLy8gICAgICAgICAgICBmW3ZdLmFkZChmW3VdKTsKICAgICAgICAgICAgZlt2XS5hZGQobm9kZShmW3VdLmZpICsgd1t2XSwgZlt1XS5zZSArIHdbdl0pKTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsKICAgIG5oYXAoKTsKICAgIHByZV9jb21wdXRlKCk7CiAgICBkZnMoMSwtMSk7CiAgICBsbCByZXMgPSAtaW5mOwogICAgZm9yKGludCBpID0gMTsgaTw9bjsgaSsrKSByZXMgPSBtYXgocmVzLCAxTEwqKGZbaV0uZmkgKyBmW2ldLnNlKSAtIHdbaV0pOwogICAgbGwgbXh0bXAgPSAtaW5mOwogICAgZm9yKGludCBpID0gMTsgaTw9bjsgaSsrKSBpZihva1tpXSkgbXh0bXAgPSBtYXgobXh0bXAgLCAxTEwqd1tpXSk7CiAgICBjb3V0IDw8IG1heChyZXMsIG14dG1wKTsKICAgIHJldHVybiAwOwp9