#include <fstream>
#include <vector>
#include <bits/stdc++.h>
std::vector<std::vector<int>> graf;
std::bitset<100000>nod_folosit;
std::ifstream input_file("dfs.in");
std::ofstream output_file("dfs.out");
// dfs
// void dfs(int nod) {
// nod_folosit[nod]=1;
// for (int urmator:graf[nod]) {
// if (!nod_folosit[urmator])
// dfs(urmator);
// }
// }
// int main() {
// int n,m,x,y,no_componente_conexe=0;
// input_file>>n>>m;
//
// graf.assign(n+1,std::vector<int>());
// for (int i=1;i<=m;i++) {
// input_file>>x>>y;
// graf[x].push_back(y);
// graf[y].push_back(x);
// }
//
// for (int i=1;i<=n;i++) {
// if (!nod_folosit[i]) {
// no_componente_conexe++;
// dfs(i);
// }
// }
//
// output_file<<no_componente_conexe;
// return 0;
// }
std::vector<int>dist;
void bfs(int nod) {
std::queue<int>coada;
coada.push(nod);
dist[nod]=1;
while (!coada.empty()) {
nod=coada.front();
coada.pop();
for (int urmator:graf[nod]) {
if (dist[urmator]==0) {
dist[urmator]=dist[nod]+1;
coada.push(urmator);
}
}
}
}
int main() {
int n,m,k,x,y;
input_file>>n>>m>>k;
dist.assign(n+1,0);
graf.assign(n+1,std::vector<int>());
for (int i=1;i<=m;i++) {
input_file>>x>>y;
graf[x].push_back(y);
}
bfs(k);
for (int i=1;i<=n;i++) {
output_file<<dist[i]-1<<" ";
}
return 0;
}