use itertools::Itertools; use proconio::{input, marker::Usize1}; fn main() { input! { n: usize, m: usize, edges: [(Usize1, Usize1); m], } let mut graph = vec![vec![]; n]; let mut deg = vec![0usize; n]; for &(u, v) in &edges { graph[u].push(v); graph[v].push(u); deg[u] += 1; deg[v] += 1; } let mut c = vec![!0; n]; let mut stack = (0..n).filter(|&i| deg[i] == 3).collect_vec(); while let Some(v) = stack.pop() { deg[v] = 0; c[v] = (0..4) .find(|&i| graph[v].iter().all(|&u| c[u] != i)) .unwrap(); for &u in &graph[v] { deg[u] = deg[u].saturating_sub(1); if deg[u] == 3 { stack.push(u); } } } for v in 0..n { if c[v] == !0 { c[v] = (0..4) .find(|&i| graph[v].iter().all(|&u| c[u] != i)) .unwrap(); } } println!("Yes"); println!("{}", c.iter().join(" ")); }