#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], ans[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]);
// cout << res;
ll mxtmp = -inf;
for(int i = 1; i<=n; i++) if(ok[i]) mxtmp = max(mxtmp , 1LL*w[i]);
cout << max(res, mxtmp);
// for(int i = 1; i<=n; i++) cout << ans[i] << ' ';
// cout << f[1].fi << ' ' << f[1].se;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgTUFYIDIwMDIwMAojZGVmaW5lIGluZiAxMDAwMDAwMDAwCiNkZWZpbmUgcGIgcHVzaF9iYWNrCgpzdHJ1Y3Qgbm9kZQp7CiAgICBsbCBmaTsKICAgIGxsIHNlOwoKICAgIG5vZGUoaW50IF9maSA9IC1pbmYsIGludCBfc2UgPSAtaW5mKQogICAgewogICAgICAgIGZpID0gX2ZpOwogICAgICAgIHNlID0gX3NlOwogICAgfQoKICAgIHZvaWQgYWRkKGNvbnN0IG5vZGUmIG90aGVyKQogICAgewogICAgICAgIGlmKG90aGVyLmZpID4gdGhpcy0+ZmkpewogICAgICAgICAgICB0aGlzLT5zZSA9IHRoaXMtPmZpOwogICAgICAgICAgICB0aGlzLT5maSA9IG90aGVyLmZpOwogICAgICAgIH1lbHNlIGlmKG90aGVyLmZpID4gdGhpcy0+c2UpewogICAgICAgICAgICB0aGlzLT5zZSA9IG90aGVyLmZpOwogICAgICAgIH0KICAgIH0KfTsKCmludCBuOwp2ZWN0b3I8aW50PiBhZGpbTUFYXTsKYm9vbCBva1tNQVhdOwppbnQgd1tNQVhdLCBhbnNbTUFYXTsKbm9kZSBmW01BWF07Cgp2b2lkIG5oYXAoKQp7CiAgICBjaW4gPj4gbjsKICAgIGZvcihpbnQgaSA9IDE7IGk8PW47IGkrKykgY2luID4+IHdbaV07CiAgICBmb3IoaW50IGkgPSAxOyBpPD1uLTE7IGkrKyl7CiAgICAgICAgaW50IGEsYjsgY2luID4+IGEgPj4gYjsKICAgICAgICBhZGpbYV0ucGIoYik7CiAgICAgICAgYWRqW2JdLnBiKGEpOwogICAgfQogICAgbWVtc2V0KG9rLHRydWUsc2l6ZW9mKG9rKSk7Cn0KCnZvaWQgcHJlX2NvbXB1dGUoKQp7CiAgICBva1sxXSA9IG9rWzBdID0gZmFsc2U7CiAgICBmb3IoaW50IGkgPSAyOyBpKmkgPD1uOyBpKyspewogICAgICAgIGlmKG9rW2ldKXsKICAgICAgICAgICAgZm9yKGludCBqID0gaSppOyBqPD1uOyBqKz0gaSkgb2tbal0gPSBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgZGZzKGludCB2LCBpbnQgcGFyKQp7CiAgICBmW3ZdLnNlID0gLWluZjsKICAgIGZbdl0uZmkgPSAob2tbdl0pPyB3W3ZdIDogLWluZjsKICAgIGZvcihpbnQgdSA6IGFkalt2XSl7CiAgICAgICAgaWYodSA9PSBwYXIpIGNvbnRpbnVlOwogICAgICAgIGRmcyh1LHYpOwogICAgICAgIGlmKGZbdV0uZmkgIT0gLWluZil7Ci8vICAgICAgICAgICAgZlt2XS5hZGQoZlt1XSk7CiAgICAgICAgICAgIGZbdl0uYWRkKG5vZGUoZlt1XS5maSArIHdbdl0sIGZbdV0uc2UgKyB3W3ZdKSk7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7CiAgICBuaGFwKCk7CiAgICBwcmVfY29tcHV0ZSgpOwogICAgZGZzKDEsLTEpOwogICAgbGwgcmVzID0gLWluZjsKICAgIGZvcihpbnQgaSA9IDE7IGk8PW47IGkrKykgcmVzID0gbWF4KHJlcywgMUxMKihmW2ldLmZpICsgZltpXS5zZSkgLSB3W2ldKTsKLy8gICAgY291dCA8PCByZXM7CiAgICBsbCBteHRtcCA9IC1pbmY7CiAgICBmb3IoaW50IGkgPSAxOyBpPD1uOyBpKyspIGlmKG9rW2ldKSBteHRtcCA9IG1heChteHRtcCAsIDFMTCp3W2ldKTsKICAgIGNvdXQgPDwgbWF4KHJlcywgbXh0bXApOwovLyAgICBmb3IoaW50IGkgPSAxOyBpPD1uOyBpKyspIGNvdXQgPDwgYW5zW2ldIDw8ICcgJzsKLy8gICAgY291dCA8PCBmWzFdLmZpIDw8ICcgJyA8PCBmWzFdLnNlOwogICAgcmV0dXJuIDA7Cn0K