/* -*- coding: utf-8 -*- * * 3426.cc: No.3426 Mod K Graph Increments (Hard) - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; /* typedef */ using ll = long long; using vi = vector; /* global variables */ vi nbrs[MAX_N]; int bs[MAX_N]; int ps[MAX_N], ds[MAX_N], cis[MAX_N]; /* subroutines */ /* main */ int main() { int tn; scanf("%d", &tn); while (tn--) { int n, m, k; scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < n; i++) nbrs[i].clear(); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--, v--; nbrs[u].push_back(v); nbrs[v].push_back(u); } for (int i = 0; i < n; i++) scanf("%d", bs + i); fill(ds, ds + n, -1); fill(cis, cis + n, 0); bool bg = true; ps[0] = -1, ds[0] = 0; ll ss[2] = {bs[0], 0}; for (int u = 0; u >= 0;) { auto &nbru = nbrs[u]; int up = ps[u]; if (cis[u] < nbru.size()) { int v = nbru[cis[u]++]; if (v != up) { if (ds[v] < 0) { ps[v] = u, ds[v] = ds[u] ^ 1; ss[ds[v]] += bs[v]; u = v; } else if (ds[v] == ds[u]) { bg = false; break; } } } else { u = up; } } //printf(" k=%d, bg=%d, ss0=%lld, ss1=%lld\n", k, bg, ss[0] % k, ss[1] % k); bool ok = true; if (bg) { if (ss[0] % k != ss[1] % k) ok = false; } else if (! (k & 1)) { ll sum = 0; for (int i = 0; i < n; i++) sum += bs[i]; if (sum & 1) ok = false; } if (ok) puts("Yes"); else puts("No"); } return 0; }