use std::fs;
use std::io::{BufWriter, Write};
use std::collections::VecDeque;
fn bfs(start_node: usize, g: &Vec<Vec<usize>>, d: &mut Vec<i32>) -> () {
let mut q: VecDeque<usize> = VecDeque::new();
d[start_node] = 0;
q.push_back(start_node);
while let Some(node) = q.pop_front() {
for &son in &g[node] {
if d[son] == -1 {
q.push_back(son);
d[son] = d[node] + 1;
}
}
}
}
fn main() {
let file = fs::File::create("bfs.out").unwrap();
let mut writer = BufWriter::new(file);
let input: String = fs::read_to_string("bfs.in").unwrap();
let mut tokens = input.split_whitespace();
let mut next_num = || -> usize {
tokens.next().unwrap().parse::<usize>().unwrap()
};
let (n, m, start_node) = (next_num(), next_num(), next_num());
let mut g: Vec<Vec<usize>> = vec![vec![]; n + 1];
for _ in 0..m {
let (x, y) = (next_num(), next_num());
g[x].push(y);
}
let mut dist: Vec<i32> = vec![-1; n + 1];
bfs(start_node, &g, &mut dist);
for i in 1..=n {
write!(writer, "{} ", dist[i]).unwrap();
}
}