#include using namespace std; void solve() { int N, M, K; cin >> N >> M >> K; vector U(M), V(M); vector> G(N); for (int i = 0; i < M; i++) { cin >> U[i] >> V[i]; U[i]--, V[i]--; G[U[i]].push_back(V[i]); G[V[i]].push_back(U[i]); } vector B(N); for (int i = 0; i < N; i++) { cin >> B[i]; } vector color(N, -1); // 未着色:-1, 白色:0, 黒色:1 for (int i = 0; i < N; i++) { if (color[i] == -1) { long long sum = 0; // 連結成分内の頂点に書かれている数字の和 long long white_sum = 0; // 連結成分内の白く塗られている頂点に書かれている数字の和 long long black_sum = 0; // 連結成分内の黒く塗られている頂点に書かれている数字の和 deque> que; color[i] = 0; que.push_back({i, 0}); bool is_bipartite = true; while (que.size()) { int v = que.front().first; int nowc = que.front().second; que.pop_front(); sum += B[v]; if (nowc == 0) { white_sum += B[v]; } else { black_sum += B[v]; } for (int to : G[v]) { if (color[to] == color[v]) { is_bipartite = false; } if (color[to] == -1) { int nxtc = nowc ^ 1; color[to] = nxtc; que.push_back({to, nxtc}); } } } if (is_bipartite == true) { if (white_sum % K != black_sum % K) { cout << "No" << endl; return; } } else { if (K % 2 == 0 && sum % 2 != 0) { cout << "No" << endl; return; } } } } cout << "Yes" << endl; } int main() { solve(); return 0; }