use std::collections::VecDeque; use proconio::{fastout, input, marker::Usize1}; #[fastout] fn main() { input! { t: usize } for _ in 0..t { let ans = solve(); match ans { Ans::Same(n) => { println!("Same\n{n}"); } Ans::Different(n) => { println!("Different\n{n}"); } Ans::Unknown => { println!("Unknown"); } } } } enum Ans { Same(usize), Different(usize), Unknown, } fn solve() -> Ans { input! { n: usize, m: usize, rel: [(Usize1, Usize1, u8); m], } let mut graph = vec![vec![]; n]; for &(a, b, c) in &rel { if c == 2 { continue; } graph[a].push(b); graph[b].push(a); } let bfs = |s: usize| { let mut que = VecDeque::from([s]); let mut dist = vec![!0usize; n]; dist[s] = 0; while let Some(current) = que.pop_front() { for &next in &graph[current] { if dist[next] == !0 { dist[next] = dist[current] + 1; que.push_back(next); } } } dist }; let d0 = bfs(0); if d0[n - 1] != !0 { return Ans::Same(d0[n - 1]); } let d1 = bfs(n - 1); let mut min = !0usize; for &(a, b, c) in &rel { if c == 2 { let cand1 = d0[a].saturating_add(d1[b]).saturating_add(1); let cand2 = d1[a].saturating_add(d0[b]).saturating_add(1); min = min.min(cand1).min(cand2); } } if min < !0 { Ans::Different(min) } else { Ans::Unknown } }