fn main() { let player = read_str(); let n = read_int()[0]; println!("{}", n - 2); if player == "Alice" { alice(n); } else { bob(n); } } fn alice(n: usize) { let mut g = vec![vec![]; n + 1]; for _ in 1..n { let a = read_int(); let (a, b) = (a[0], a[1]); g[a].push(b); g[b].push(a); } let mut seq = vec![]; for _ in 2..n { let x = (1..=n).find(|x| g[*x].len() == 1).unwrap(); let y = g[x][0]; seq.push(y); g[x].clear(); g[y].retain(|p| *p != x); } use util::*; println!("{}", seq.iter().join(" ")); } fn bob(n: usize) { let seq = read_int(); let mut deg = vec![1; n + 1]; for a in seq.iter() { deg[*a] += 1; } let mut ans = vec![]; for s in seq.iter() { let x = (1..=n).find(|v| deg[*v] == 1).unwrap(); ans.push((*s, x)); deg[*s] -= 1; deg[x] -= 1; } let p = (1..=n).filter(|v| deg[*v] > 0).collect::>(); ans.push((p[0], p[1])); for (a, b) in ans { println!("{a} {b}"); } } fn read_str() -> String { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); String::from(s.trim()) } fn read_int() -> Vec { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); s.trim().split_whitespace().flat_map(|s| s.parse()).collect() } mod util { pub trait Join { fn join(self, sep: &str) -> String; } impl Join for I where I: Iterator, T: std::fmt::Display, { fn join(self, sep: &str) -> String { let mut s = String::new(); use std::fmt::*; for (i, v) in self.enumerate() { if i > 0 { write!(&mut s, "{}", sep).ok(); } write!(&mut s, "{}", v).ok(); } s } } }