#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
std::ifstream fin("bfs.in.text");
std::ofstream fout("bfs.out.text");
std::vector<int> parcurs;
std::vector<std::vector<int>>graf;
void bfs(int node){
std::queue<int> q;
q.push(node);
parcurs[node] = 0;
while (!q.empty()) {
int actual = q.front();
q.pop();
for (int i : graf[actual]) {
if(parcurs[i]==-1){
parcurs[i]=parcurs[actual]+1;
q.push(i);
}
}
}
}
int main(){
int n, m, start;
if (!(fin >> n >> m>>start))
return 0;
graf.resize(n + 1);
parcurs.resize(n + 1, -1);
for (int i = 0; i < m; ++i) {
int x, y;
fin >> x >> y;
graf[x].push_back(y);
}
bfs(start);
for (int i = 1; i <= n; ++i) {
fout << parcurs[i] << " ";
}
return 0;
}