#define _GLIBCXX_DEBUG #include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define vin(vec, n) rep (i, n) cin >> vec[i]; using ll = long long; using vi = vector; using vvi = vector>; using vc = vector; using vvc = vector>; using pii = pair; const ll MOD = 998244353, MOD2 = 1000000007; /************************************************************************************/ //何を問われているか - ll N; const ll MAX_N = 2e5; vector A(MAX_N); vector> tree(MAX_N); map, ll> dict; ll rec(ll prev, ll pos) { if (dict.count({prev, pos})) return dict[{prev, pos}]; ll res = 0; for (ll next : tree[pos]) { if (next != prev) { res += A[pos] * rec(pos, next) % MOD; } } if (prev != -1) res += A[pos]; return dict[{prev, pos}] = res % MOD; } int main() { cin >> N; rep (i, N) cin >> A[i]; rep (i, N-1) { ll u, v; cin >> u >> v; --u; --v; tree[u].push_back(v); tree[v].push_back(u); } ll ans = 0; rep (i, N) { ans += rec(-1, i); ans %= MOD; } cout << ans * ((MOD + 1) / 2) % MOD << '\n'; }