#include <iostream>
#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
ll mod = 998244353;
vector<ll> s;
vector<ll> dp;
vector<ll> arr;
ll me(ll a,ll b,ll mod){
ll x=1;
a=a%mod;
while(b>0){
if(b%2==1){
x=(x*a)%mod;
}
a=(a*a)%mod;
b=b/2;
}
return x;
}
void dfs(int node , vector<vector<ll>> &g , vector<ll> &visited , vector<ll> &parent){
visited[node]=1;
for(auto &it : g[node]){
if(visited[it]==0){
parent[it]=node;
dfs(it,g,visited,parent);
}
}
ll sum = 0;
ll count =0;
for(auto &it : g[node]){
if(it != parent[node]){
count = count + dp[it];
sum = sum + s[it];
}
}
if(arr[node]<0){
dp[node]=1+count;
s[node]=sum + abs(arr[node]);
}
else{
dp[node]=count;
s[node]=sum + abs(arr[node]);
}
}
int main() {
// your code goes here
// Taking 0-based indexing
ll n,u,v;
cin>>n;
ll sum=0;
ll count = 0;
ll ans = 0;
s.resize(n,0);
dp.resize(n,0);
arr.resize(n,0);
for(int i=0;i<n;i++){
cin>>arr[i];
if(arr[i]<0){
count++;
}
sum=sum+abs(arr[i]);
}
vector<vector<ll>> g(n);
for(int i=0;i<n-1;i++){
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
vector<ll> visited(n,0);
vector<ll> parent(n,-1);
dfs(0,g,visited,parent);
if(count%2==0){
cout<<(me(2,sum,mod))<<endl;
}
else{
for(int i=0;i<n;i++){
if(arr[i]<0){
if((count-dp[i])%2==0){
ll res = sum - s[i];
ans = max(ans,res);
}
for(auto &it : g[i]){
if(it!=parent[i]){
if(dp[it]%2==0){
ans = max(ans,s[it]);
}
}
}
}
}
cout<<me(2,ans,mod)<<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgbGw7CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmxsIG1vZCA9IDk5ODI0NDM1MzsKCgl2ZWN0b3I8bGw+IHM7Cgl2ZWN0b3I8bGw+IGRwOwogICAgdmVjdG9yPGxsPiBhcnI7CiAgICAKbGwgbWUobGwgYSxsbCBiLGxsIG1vZCl7CglsbCB4PTE7CglhPWElbW9kOwoJCgl3aGlsZShiPjApewoJCWlmKGIlMj09MSl7CgkJCXg9KHgqYSklbW9kOwoJCX0KCQlhPShhKmEpJW1vZDsKCQliPWIvMjsKCX0KCXJldHVybiB4Owp9Cgp2b2lkIGRmcyhpbnQgbm9kZSAsIHZlY3Rvcjx2ZWN0b3I8bGw+PiAmZyAsIHZlY3RvcjxsbD4gJnZpc2l0ZWQgLCB2ZWN0b3I8bGw+ICZwYXJlbnQpewoJdmlzaXRlZFtub2RlXT0xOwoJZm9yKGF1dG8gJml0IDogZ1tub2RlXSl7CgkJaWYodmlzaXRlZFtpdF09PTApewoJCQlwYXJlbnRbaXRdPW5vZGU7CgkJCWRmcyhpdCxnLHZpc2l0ZWQscGFyZW50KTsKCQl9Cgl9CgkKCWxsIHN1bSA9IDA7CglsbCBjb3VudCA9MDsKCQoJCglmb3IoYXV0byAmaXQgOiBnW25vZGVdKXsKCQlpZihpdCAhPSBwYXJlbnRbbm9kZV0pewoJCSAgICBjb3VudCA9IGNvdW50ICsgZHBbaXRdOwoJCQlzdW0gPSBzdW0gKyBzW2l0XTsKCQl9CgkJCgl9CgkKCWlmKGFycltub2RlXTwwKXsKCQlkcFtub2RlXT0xK2NvdW50OwoJCXNbbm9kZV09c3VtICsgYWJzKGFycltub2RlXSk7Cgl9CgllbHNlewoJCWRwW25vZGVdPWNvdW50OwoJCXNbbm9kZV09c3VtICsgYWJzKGFycltub2RlXSk7CgkJCgl9Cn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJCgkKCS8vIFRha2luZyAwLWJhc2VkIGluZGV4aW5nCgkKCQoJbGwgbix1LHY7CgljaW4+Pm47CgoJbGwgc3VtPTA7CgkKCWxsIGNvdW50ID0gMDsKCWxsIGFucyA9IDA7CgkKCXMucmVzaXplKG4sMCk7CglkcC5yZXNpemUobiwwKTsKCWFyci5yZXNpemUobiwwKTsKCQoJCgkKCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCWNpbj4+YXJyW2ldOwoJCWlmKGFycltpXTwwKXsKCQkJY291bnQrKzsKCQl9CgkJc3VtPXN1bSthYnMoYXJyW2ldKTsKCX0KCQoJdmVjdG9yPHZlY3RvcjxsbD4+IGcobik7Cglmb3IoaW50IGk9MDtpPG4tMTtpKyspewoJCWNpbj4+dT4+djsKCQlnW3VdLnB1c2hfYmFjayh2KTsKCQlnW3ZdLnB1c2hfYmFjayh1KTsKCQkKCX0KCQoJdmVjdG9yPGxsPiB2aXNpdGVkKG4sMCk7CgoJdmVjdG9yPGxsPiBwYXJlbnQobiwtMSk7CgkKCQoJCglkZnMoMCxnLHZpc2l0ZWQscGFyZW50KTsKCQoJCglpZihjb3VudCUyPT0wKXsKCQljb3V0PDwobWUoMixzdW0sbW9kKSk8PGVuZGw7Cgl9CgllbHNlewoJCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCQlpZihhcnJbaV08MCl7CgkJCQlpZigoY291bnQtZHBbaV0pJTI9PTApewoJCQkJCWxsIHJlcyA9IHN1bSAtIHNbaV07CgkJCQkJYW5zID0gbWF4KGFucyxyZXMpOwoJCQkJfQoJCQkJCgkJCQkKCQkJCWZvcihhdXRvICZpdCA6IGdbaV0pewoJCQkJCWlmKGl0IT1wYXJlbnRbaV0pewoJCQkJCQlpZihkcFtpdF0lMj09MCl7CgkJCQkJCQlhbnMgPSBtYXgoYW5zLHNbaXRdKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQljb3V0PDxtZSgyLGFucyxtb2QpPDxlbmRsOwoJCQoJfQoJcmV0dXJuIDA7Cn0=