#include <iostream>
#include <list>
#include <vector>
#include <fstream>
using namespace std;
void BFS(int vertice, bool visited[], vector<vector<int>> adj, int size) {
ofstream g("bfs.out");
int contor = 0;
vector<int> distanta(size);
visited[vertice] = true;
distanta[vertice] = 0;
list<int> queue;
queue.push_back(vertice);
while (!queue.empty()) {
vertice = queue.front();
queue.pop_front();
for (int i = 0; i < adj[vertice].size(); i++) {
if (!visited[adj[vertice][i]]) {
visited[adj[vertice][i]] = true;
queue.push_back(adj[vertice][i]);
distanta[adj[vertice][i]] = contor;
}
}
contor++;
}
for (int i = 0; i < size; i++) {
if (visited[i]) {
g << distanta[i] << " ";
} else {
g << -1 << " ";
}
}
}
int main() {
ifstream f("bfs.in");
int vertices, i, from, to, conexe = 0, j, edges, nod;
f>>vertices;
f>>edges;
f>>nod;
bool *visited = new bool[vertices];
vector<vector<int>> adj((unsigned long) vertices, vector<int> ((unsigned long) vertices));
for (i = 0; i < vertices; i++) {
visited[i] = false;
}
for (i = 0; i < edges; i++) {
f >> from; f >> to;
adj[from].push_back(to);
}
BFS(nod, visited, adj, vertices);
}