#include <fstream>
#include <queue>
#include <vector>
std::ifstream f("bfs.in");
std::ofstream g("bfs.out");
int n,m,source;
std::vector<std::vector<int>> adj;
std::vector<int> dist;
void BFS(int source) {
std::queue<int> q;
q.push(source);
dist[source] = 0;
while (!q.empty()) {
int node = q.front();
q.pop();
for (int neighbor : adj[node]) {
if (dist[neighbor] == -1) {
dist[neighbor] = dist[node] + 1;
q.push(neighbor);
}
}
}
}
int main() {
if (!(f >> n >> m >> source)) {
return 1;
}
adj.resize(n + 1);
dist.assign(n + 1, -1);
for (int i = 0; i < m; ++i) {
int from, to;
f >> from >> to;
adj[from].push_back(to);
}
BFS(source);
for (int node = 1; node <= n; ++node) {
if (node > 1) {
g << ' ';
}
g << dist[node];
}
g << '\n';
return 0;
}