#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define NMAX 100001
using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");
void BFS(int node, int N, vector <int> edges_list[NMAX]) {
queue < pair<int, int> > q;
bool visited[NMAX];
int distance[NMAX], tr = 0;
for (int i = 1 ; i <= N ; i++) {
distance[i] = -1;
}
q.push(make_pair(node, 0));
distance[node] = 0;
visited[node] = 1;
int actnode, actdist;
while(q.empty() != 1) {
actnode = q.front().first;
actdist = q.front().second;
q.pop();
for (int i = 0 ; i < edges_list[actnode].size() ; i++) {
if (visited[edges_list[actnode][i]] == 0) {
distance[edges_list[actnode][i]] = actdist + 1;
visited[edges_list[actnode][i]] = 1;
q.push(make_pair(edges_list[actnode][i], actdist + 1));
}
}
}
for (int i = 1 ; i <= N ; i++) {
g<<distance[i]<<' ';
}
}
int main()
{
int N, M, S, x, y;
vector <int> edges_list[NMAX];
f>>N>>M>>S;
for (int i = 0 ; i < M ; i++) {
f>>x>>y;
edges_list[x].push_back(y);
}
BFS(S, N, edges_list);
return 0;
}