// #include <bits/stdc++.h>
//
// using namespace std;
//
// vector<int> L[100001];
// int vis[100001];
//
// void dfs(int node) {
// vis[node] = 1;
// for (auto vec : L[node]) {
// if (vis[vec] == 0) {
// dfs(vec);
// }
// }
// }
//
// int main() {
// ifstream fin("dfs.in");
// ofstream fout("dfs.out");
// int n,m;
// fin >> n >> m;
// for (int i = 1; i <= m; i++) {
// int a,b;
// fin >> a >> b;
// L[a].push_back(b);
// L[b].push_back(a);
// }
// int nr = 0;
// for (int i = 1; i <= n; i++) {
// if (vis[i] == 0) {
// nr++;
// dfs(i);
// }
// }
// fout << nr;
//
// fin.close();
// fout.close();
// }
#include <bits/stdc++.h>
using namespace std;
vector<int> L[100001];
int d[100001];
int n, m, s;
void bfs(int sursa) {
for (int i = 1; i <= n; i++) {
d[i] = -1; //d[i] = distanta minima de la sursa la i
}
d[sursa] = 0;
queue<int> q;
while (q.empty() == false) {
int node = q.front();
q.pop();
for (auto vec: L[node]) {
if (d[vec] == -1) {
d[vec] = d[node] + 1;
q.push(vec);
}
}
}
}
int main() {
ifstream fin("dfs.in");
ofstream fout("dfs.out");
fin >> n >> m >> s;
for (int i = 1; i <= m; i++) {
int a,b;
fin >> a >> b;
L[a].push_back(b);
bfs(s);
}
for(int i = 1; i <= n; i++) fout << d[i] << ' ';
}