// 「連結」じゃん!!! #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; // 二部グラフ判定か!!! bool solve() { vector color(n, -1); queue que; bool binary = true; que.push(0); color[0] = 0; while (!que.empty()) { int v = que.front(); que.pop(); for (int nv: et[v]) { if (color[nv] == -1) { color[nv] = !color[v]; que.push(nv); } else if (color[nv] == color[v]) { binary = false; break; } } } int i; if (!binary) { if (K % 2 == 1) return true; int res = 0; rep(i, n) res += b[i]; return res % 2 == 0; } int x = 0, y = 0; rep(i, n) { if (color[i] == 0) x += b[i]; else y += b[i]; } return x % K == y % K; } 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; }