// 「連結」じゃん!!! #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i, n) for(i = 0; i < n; i++) #define int long long using namespace std; using namespace atcoder; using mint = modint998244353; int n, m, K; vector> et; vector U, V; vector b; // 辺p--vの操作回数を返す int dfs(int p, int v) { int cnt = 0; for (int nv: et[v]) { if (nv == p) continue; cnt += dfs(v, nv); cnt %= K; } int ret = (b[v] - cnt + K) % K; return ret; } bool solve() { int i; dsu uf(n); rep(i, m) { uf.merge(U[i], V[i]); } auto gs = uf.groups(); vector v2gid(n, -1); rep(i, gs.size()) { for (int v: gs[i]) { v2gid[v] = i; } } vector gid2ecnt(gs.size()); rep(i, m) { int gid = v2gid[U[i]]; gid2ecnt[gid]++; } rep(i, gs.size()) { assert(gid2ecnt[i] >= (int)gs[i].size() - 1); assert(gid2ecnt[i] == m); assert(gs[i].size() == n); if (gid2ecnt[i] == (int)gs[i].size() - 1) { int res = dfs(-1, gs[i][0]); if (res != 0) return false; } else if (K % 2 == 0) { int res = 0; for (int v: gs[i]) res += b[v]; if (res % 2 != 0) return false; } } return true; } signed main() { int T; cin >> T; while (T--) { cin >> n >> m >> K; et.clear(); et.resize(n); U.clear(); V.clear(); int i; rep(i, m) { int u, v; cin >> u >> v; u--; v--; et[u].push_back(v); et[v].push_back(u); U.push_back(u); V.push_back(v); } b.clear(); b.resize(n); rep(i, n) { cin >> b[i]; } bool res = solve(); if (res) { cout << "Yes" << endl; } else { cout << "No" << endl; } } return 0; }