#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <queue>
#include <list>
#include <vector>
#define MAX_NODES 100010
using namespace std;
void add_edge(vector<int> lg[], int nod1, int nod2) {
lg[nod1].push_back(nod2);
}
void bfs_graph(vector<int> lg[], int nodes, int node, int *visited, int *dist) {
queue <int> q;
int i, value;
visited[node] = 1;
dist[node] = 0;
q.push(node);
while(!q.empty()) {
value = q.front();
q.pop();
for(auto i : lg[value]) {
if (visited[i] == 0) {
visited[i] = 1;
dist[i] = dist[value] + 1;
q.push(i);
}
}
}
}
int main() {
ifstream fin("bfs.in");
ofstream fout("bfs.out");
int i, nodes, x, y, edges, node, visited[MAX_NODES], dist[MAX_NODES];
fin >> nodes >> edges >> node;
vector<int> lg[nodes+1];
for(i = 1; i <= edges; i++) {
fin >> x >> y;
add_edge(lg, x, y);
}
for (i = 1; i <= nodes; i++) {
visited[i] = 0;
dist[i] = -1;
}
bfs_graph(lg, nodes, node, visited, dist);
for (i = 1; i <= nodes; ++i) {
fout << dist[i] << ' ';
}
fin.close();
fout.close();
return 0;
}