#define F
using namespace std;
#ifdef IO
#include <iostream>
#define fin cin
#define fout cout
#endif
#ifdef F
#include <fstream>
ifstream fin("bfs.in");
ofstream fout("bfs.out");
#endif
#include <vector>
#include <queue>
#include <tuple>
#include <cstring>
int N, M, S, x, y;
vector <int> G[100002];
int costs[100002];
void getMinDistance(int startNode);
int main() {
fin >> N >> M >> S;
memset(costs, -1, sizeof(costs));
for (int i = 1; i <= M; ++i) {
fin >> x >> y;
G[x].push_back(y);
}
getMinDistance(S);
for (int i = 1; i <= N; ++i) {
fout << costs[i] << ' ';
}
#ifdef F
fin.close();
fout.close();
#endif
}
void getMinDistance(int startNode) {
queue <pair <int, int>> Q;
bool visited[100002];
Q.push(make_pair(startNode, 0));
visited[startNode] = true;
while (!Q.empty()) {
auto crtNode = Q.front();
costs[crtNode.first] = crtNode.second;
Q.pop();
for (auto i = G[crtNode.first].begin(); i != G[crtNode.first].end(); ++i) {
if (!visited[*i]) {
Q.push(make_pair(*i, (crtNode.second + 1)));
visited[*i] = true;
}
}
}
}