import sys sys.setrecursionlimit(300000) def main(): # 入力読み込み input = sys.stdin.read data = input().split() iterator = iter(data) try: num_test_cases = int(next(iterator)) except StopIteration: return results = [] for _ in range(num_test_cases): try: N = int(next(iterator)) M = int(next(iterator)) K = int(next(iterator)) except StopIteration: break # グラフ構築 adj = [[] for _ in range(N)] for _ in range(M): u = int(next(iterator)) - 1 v = int(next(iterator)) - 1 adj[u].append(v) adj[v].append(u) # 目標値配列 B B = [] for _ in range(N): B.append(int(next(iterator))) # 連結成分ごとの判定 colors = [-1] * N # -1:未訪問, 0/1:彩色 possible = True for i in range(N): if colors[i] != -1: continue # BFSで連結成分の調査と二部グラフ判定を行う q = [i] colors[i] = 0 sum_c0 = B[i] # 色0の頂点のBの和 sum_c1 = 0 # 色1の頂点のBの和 total_sum = B[i] # 成分全体のBの和 is_bipartite = True idx = 0 while idx < len(q): u = q[idx] idx += 1 c_u = colors[u] for v in adj[u]: if colors[v] == -1: # 未訪問なら色を塗ってキューに追加 colors[v] = 1 - c_u q.append(v) # 和の更新 if colors[v] == 0: sum_c0 += B[v] else: sum_c1 += B[v] total_sum += B[v] elif colors[v] == c_u: # 同色が隣接していたら二部グラフではない is_bipartite = False # 成分ごとの判定ロジック if is_bipartite: # 二部グラフの場合: (色0の和 - 色1の和) が K の倍数でなければならない diff = sum_c0 - sum_c1 if diff % K != 0: possible = False break else: # 非二部グラフの場合 if K % 2 != 0: # Kが奇数なら常に可能(調整可能) pass else: # Kが偶数なら、総和が偶数でなければならない if total_sum % 2 != 0: possible = False break if possible: results.append("Yes") else: results.append("No") print('\n'.join(results)) if __name__ == '__main__': main()