use proconio::{input, marker::Usize1}; fn solve() -> bool { input! { n: usize, m: usize, k: u64, uv: [(Usize1, Usize1); m], b: [u64; n], } assert_eq!(m, n - 1); let mut graph = vec![vec![]; n]; for &(ui, vi) in uv.iter() { graph[ui].push(vi); graph[vi].push(ui); } let mut a = vec![0; n]; let mut visited = vec![false; n]; visited[0] = true; let mut parent = vec![0; n]; let mut stack = vec![(0, true)]; while let Some((cur, f)) = stack.pop() { if f { for &nxt in graph[cur].iter() { if visited[nxt] { continue; } visited[nxt] = true; parent[nxt] = cur; stack.push((nxt, false)); stack.push((nxt, true)); } } else { let d = (k + b[cur] - a[cur]) % k; a[cur] += d; a[cur] %= k; a[parent[cur]] += d; a[parent[cur]] %= k; } } a[0] == b[0] } fn main() { input! { t: usize, } for _ in 0..t { println!("{}", if solve() { "Yes" } else { "No" }); } }