#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;
}