#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int X = 500000;
vector<int> znajomosc[X];
bool odwiedzony[X];
int odleglosc[X];
void uncharted_map(int start) {
queue<int> q;
q.push(start);
odwiedzony[start] = true;
odleglosc[start] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : znajomosc[u]) {
if (!odwiedzony[v]) {
odwiedzony[v] = true;
odleglosc[v] = odleglosc[u] + 1;
q.push(v);
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int Z;
cin >> Z;
while (Z--) {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
znajomosc[i].clear();
odwiedzony[i] = false;
odleglosc[i] = -1;
}
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
znajomosc[a].push_back(b);
znajomosc[b].push_back(a);
}
int moj_numer;
cin >> moj_numer;
uncharted_map(moj_numer);
cout << "Znajomi numeru " << moj_numer << ":\n";
vector<pair<int, int>> wyniki;
for (int i = 1; i <= n; ++i) {
if (i != moj_numer && odleglosc[i] != -1) {
wyniki.emplace_back(i, odleglosc[i]);
}
}
sort(wyniki.begin(), wyniki.end());
for (auto [kto, odl] : wyniki) {
cout << kto << ": " << odl << "\n";
}
int grupy = 0;
for (int i = 1; i <= n; ++i) {
if (!odwiedzony[i]) {
uncharted_map(i);
grupy++;
}
}
cout << "Grup znajomych jest " << (grupy + 1) << ".";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBYID0gNTAwMDAwOwp2ZWN0b3I8aW50PiB6bmFqb21vc2NbWF07CmJvb2wgb2R3aWVkem9ueVtYXTsKaW50IG9kbGVnbG9zY1tYXTsKdm9pZCB1bmNoYXJ0ZWRfbWFwKGludCBzdGFydCkgewogICAgcXVldWU8aW50PiBxOwogICAgcS5wdXNoKHN0YXJ0KTsKICAgIG9kd2llZHpvbnlbc3RhcnRdID0gdHJ1ZTsKICAgIG9kbGVnbG9zY1tzdGFydF0gPSAwOwogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBpbnQgdSA9IHEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGZvciAoaW50IHYgOiB6bmFqb21vc2NbdV0pIHsKICAgICAgICAgICAgaWYgKCFvZHdpZWR6b255W3ZdKSB7CiAgICAgICAgICAgICAgICBvZHdpZWR6b255W3ZdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG9kbGVnbG9zY1t2XSA9IG9kbGVnbG9zY1t1XSArIDE7CiAgICAgICAgICAgICAgICBxLnB1c2godik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgaW50IFo7CiAgICBjaW4gPj4gWjsKICAgIHdoaWxlIChaLS0pIHsKICAgICAgICBpbnQgbiwgbTsKICAgICAgICBjaW4gPj4gbiA+PiBtOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgICAgICAgICB6bmFqb21vc2NbaV0uY2xlYXIoKTsKICAgICAgICAgICAgb2R3aWVkem9ueVtpXSA9IGZhbHNlOwogICAgICAgICAgICBvZGxlZ2xvc2NbaV0gPSAtMTsKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgICAgICAgaW50IGEsIGI7CiAgICAgICAgICAgIGNpbiA+PiBhID4+IGI7CiAgICAgICAgICAgIHpuYWpvbW9zY1thXS5wdXNoX2JhY2soYik7CiAgICAgICAgICAgIHpuYWpvbW9zY1tiXS5wdXNoX2JhY2soYSk7CiAgICAgICAgfQogICAgICAgIGludCBtb2pfbnVtZXI7CiAgICAgICAgY2luID4+IG1val9udW1lcjsKICAgICAgICB1bmNoYXJ0ZWRfbWFwKG1val9udW1lcik7CiAgICAgICAgY291dCA8PCAiWm5ham9taSBudW1lcnUgIiA8PCBtb2pfbnVtZXIgPDwgIjpcbiI7CiAgICAgICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiB3eW5pa2k7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgICAgIGlmIChpICE9IG1val9udW1lciAmJiBvZGxlZ2xvc2NbaV0gIT0gLTEpIHsKICAgICAgICAgICAgICAgIHd5bmlraS5lbXBsYWNlX2JhY2soaSwgb2RsZWdsb3NjW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb3J0KHd5bmlraS5iZWdpbigpLCB3eW5pa2kuZW5kKCkpOwogICAgICAgIGZvciAoYXV0byBba3RvLCBvZGxdIDogd3luaWtpKSB7CiAgICAgICAgICAgIGNvdXQgPDwga3RvIDw8ICI6ICIgPDwgb2RsIDw8ICJcbiI7CiAgICAgICAgfQogICAgICAgIGludCBncnVweSA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgICAgIGlmICghb2R3aWVkem9ueVtpXSkgewogICAgICAgICAgICAgICAgdW5jaGFydGVkX21hcChpKTsKICAgICAgICAgICAgICAgIGdydXB5Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY291dCA8PCAiR3J1cCB6bmFqb215Y2ggamVzdCAiIDw8IChncnVweSArIDEpIDw8ICIuIjsKICAgIH0KICAgIHJldHVybiAwOwp9