use proconio::{input, marker::Usize1}; use std::collections::VecDeque; fn main() { input! { n: usize, m: usize, uv: [(Usize1, Usize1); m], k: usize, a: [Usize1; k], } let mut graph = vec![vec![]; n]; for (u, v) in uv { graph[u].push(v); graph[v].push(u); } let mut is_yiwiy = vec![false; n]; for i in a { is_yiwiy[i] = true; } let mut visited = vec![vec![usize::MAX; n]; 5]; let mut queue = VecDeque::new(); queue.push_back((0, 0, 0)); while let Some((pos, yiwiy_count, count)) = queue.pop_front() { for &next in &graph[pos] { if is_yiwiy[next] { if yiwiy_count + 1 == 5 || visited[yiwiy_count + 1][next] <= count + 1 { continue; } visited[yiwiy_count + 1][next] = count + 1; queue.push_back((next, yiwiy_count + 1, count + 1)); } else { if visited[0][next] <= count + 1 { continue; } visited[0][next] = count + 1; queue.push_back((next, 0, count + 1)); } } } let mut ans = usize::MAX; for i in 0..5 { ans = ans.min(visited[i][n - 1]); } if ans == usize::MAX { println!("-1"); } else { println!("{}", ans); } }