import java.util.*;
public class Main {
public static void main
(String[] args
) { Scanner sc
= new Scanner
(System.
in);
int n = sc.nextInt(); // nodes
int m = sc.nextInt(); // number of edges
// Adjancecy list representation
List
<Integer
>[] G
= new List[n
+1]; for (int i = 0; i <= n; i++) {
G[i] = new ArrayList<>();
}
// Reading edges and building undirected graph
for (int i = 0; i < m; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
G[u].add(v);
G[v].add(u);
}
Queue<Integer> q = new LinkedList<>();
int source = sc.nextInt(); // starting node for BFS
q.add(source);
int[] used = new int[n+1]; // track visited nodes
used[source] = 1;
int[] lvl = new int[n+1]; // shortest distance from source
lvl[source] = 0;
// BFS traversal
while (!q.isEmpty()) {
int v = q.poll(); // current node and poll removes and return the head of the node
for (int u : G[v]) { // explore all neighbors
if (used[u] == 0) { // visit unvisited neighbor
q.add(u);
used[u] = 1;
lvl[u] = lvl[v] + 1; // distance = parent's distance + 1
}
}
}
// Output shortest distances from source to all nodes
for (int i = 1; i <= n; i++) {
System.
out.
print(lvl
[i
] + " "); }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgc2MgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwoKICAgICAgICBpbnQgbiA9IHNjLm5leHRJbnQoKTsgLy8gbm9kZXMKICAgICAgICBpbnQgbSA9IHNjLm5leHRJbnQoKTsgLy8gbnVtYmVyIG9mIGVkZ2VzCgogICAgICAgIC8vIEFkamFuY2VjeSBsaXN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgTGlzdDxJbnRlZ2VyPltdIEcgPSBuZXcgTGlzdFtuKzFdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBHW2ldID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWFkaW5nIGVkZ2VzIGFuZCBidWlsZGluZyB1bmRpcmVjdGVkIGdyYXBoCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgaW50IHUgPSBzYy5uZXh0SW50KCk7CiAgICAgICAgICAgIGludCB2ID0gc2MubmV4dEludCgpOwogICAgICAgICAgICBHW3VdLmFkZCh2KTsKICAgICAgICAgICAgR1t2XS5hZGQodSk7CiAgICAgICAgfQoKICAgICAgICBRdWV1ZTxJbnRlZ2VyPiBxID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgIGludCBzb3VyY2UgPSBzYy5uZXh0SW50KCk7IC8vIHN0YXJ0aW5nIG5vZGUgZm9yIEJGUwogICAgICAgIHEuYWRkKHNvdXJjZSk7CgogICAgICAgIGludFtdIHVzZWQgPSBuZXcgaW50W24rMV07IC8vIHRyYWNrIHZpc2l0ZWQgbm9kZXMKICAgICAgICB1c2VkW3NvdXJjZV0gPSAxOwoKICAgICAgICBpbnRbXSBsdmwgPSBuZXcgaW50W24rMV07IC8vIHNob3J0ZXN0IGRpc3RhbmNlIGZyb20gc291cmNlCiAgICAgICAgbHZsW3NvdXJjZV0gPSAwOwoKICAgICAgICAvLyBCRlMgdHJhdmVyc2FsCiAgICAgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgewogICAgICAgICAgICBpbnQgdiA9IHEucG9sbCgpOyAvLyBjdXJyZW50IG5vZGUgYW5kIHBvbGwgcmVtb3ZlcyBhbmQgcmV0dXJuIHRoZSBoZWFkIG9mIHRoZSBub2RlCiAgICAgICAgICAgIGZvciAoaW50IHUgOiBHW3ZdKSB7IC8vIGV4cGxvcmUgYWxsIG5laWdoYm9ycwogICAgICAgICAgICAgICAgaWYgKHVzZWRbdV0gPT0gMCkgeyAvLyB2aXNpdCB1bnZpc2l0ZWQgbmVpZ2hib3IKICAgICAgICAgICAgICAgICAgICBxLmFkZCh1KTsKICAgICAgICAgICAgICAgICAgICB1c2VkW3VdID0gMTsKICAgICAgICAgICAgICAgICAgICBsdmxbdV0gPSBsdmxbdl0gKyAxOyAvLyBkaXN0YW5jZSA9IHBhcmVudCdzIGRpc3RhbmNlICsgMQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBPdXRwdXQgc2hvcnRlc3QgZGlzdGFuY2VzIGZyb20gc291cmNlIHRvIGFsbCBub2RlcwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGx2bFtpXSArICIgIik7CiAgICAgICAgfQogICAgfQp9Cg==