use ac_library::{Dsu, ModInt998244353}; use proconio::{input, marker::Usize1}; type Mint = ModInt998244353; fn main() { input! { n: usize, q: usize, queries: [(u8, Usize1, Usize1); q], } let mut dsu = Dsu::new(n); let mut graph = vec![vec![]; n]; for &(t, a, b) in &queries { if !dsu.same(a, b) { dsu.merge(a, b); graph[a].push((b, t)); graph[b].push((a, t)); } } let mut color = vec![2u8; n]; let mut stack = vec![]; for root in 0..n { if color[root] != 2 { continue; } color[root] = 0; stack.push((root, !0)); while let Some((v, p)) = stack.pop() { for &(u, w) in &graph[v] { if u == p { continue; } color[u] = color[v] ^ w; stack.push((u, v)); } } } for &(t, a, b) in &queries { if color[a] != color[b] ^ t { println!("0"); return; } } let k = dsu.groups().len(); let ans = Mint::raw(2).pow(k as _); println!("{ans}"); }