//#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, ans = 0; const ll MAX_N = 2e5; vector A(MAX_N); vector> tree(MAX_N); ll dfs (ll v, ll p) { ll sum = 0, sum2 = 0; for (ll nv : tree[v]) { if (nv == p) continue; ll x = dfs(nv, v); sum += x; sum %= MOD; sum2 += x * x; sum2 %= MOD; } ll pair_sum = (sum * sum % MOD - sum2 + MOD) % MOD; pair_sum = pair_sum * ((MOD + 1) / 2) % MOD; ans += A[v] * ((sum + pair_sum) % MOD) % MOD; ans %= MOD; return A[v] * (1 + sum) % 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); } dfs(0, -1); cout << ans << '\n'; }