// 軽めの実装 #include using namespace std; #include typedef atcoder::modint998244353 mint; int main() { int n, m; cin >> n >> m; vector b(n); for (int i=0; i> x; b[i] = x; } vector u(m), v(m); vector ikeru(n, vector>(0)); for (int i=0; i> u[i] >> v[i]; u[i]--; v[i]--; ikeru[u[i]].push_back(pair(v[i],i)); ikeru[v[i]].push_back(pair(u[i],i)); } vector new_ikeru(n, vector>(0)); vector color(n); vector tansaku(n); vector ans(m); mint total = 0; auto dfs = [&](auto self, int i) -> void { tansaku[i] = 1; if (color[i] == 0) total += b[i]; else total -= b[i]; for (auto [j,c]: ikeru[i]) { if (tansaku[j]) continue; color[j] = color[i] ^ 1; new_ikeru[i].push_back(pair(j,c)); new_ikeru[j].push_back(pair(i,c)); self(self, j); } }; dfs(dfs, 0); for (int i=0; i void { for (auto [j,c]: new_ikeru[i]) { if (j == p) continue; self(self, j, i); ans[c] = b[j]; b[j] -= ans[c]; b[i] -= ans[c]; } }; dfs2(dfs2, 0, -1); for (int i=0; i