#include <fstream>
#include <queue>
using namespace std;
ifstream cin("bfs.in");
ofstream cout("bfs.out");
class Graph{
public:
vector<vector<int>> e;
int n_nodes;
void build_graph(int num_nodes, int num_edges, bool directed) {
n_nodes = num_nodes;
e.resize(n_nodes);
while (num_edges --){
int x, y;
cin >> x >> y;
x --; y--;
e[x].push_back(y);
if (!directed)
e[y].push_back(x);
}
}
};
vector <int> bfs(Graph &g, int source) {
queue <int> q;
q.push(source);
vector <int> res(g.n_nodes, -1);
res[source] = 0;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (auto next : g.e[cur])
// undiscovered node
if (res[next] == -1) {
res[next] = res[cur] + 1;
q.push(next);
}
}
return res;
}
int main() {
int source, num_nodes, num_edges;
cin >> num_nodes >> num_edges >> source;
source--;
Graph g;
g.build_graph(num_nodes, num_edges, true);
vector<int> result = bfs(g, source);
for (auto x : result)
cout << x << " ";
return 0;
}