#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <queue>
using namespace std;
int main() {
int n, m;
if (!(cin >> n >> m)) return 0;
map<string, vector<string>> adjList;
map<string, int> dist;
map<string, string> parent;
map<string, bool> visited;
for (int i = 0; i < m; i++) {
string u, v;
cin >> u >> v;
if (u == v) {
adjList[u];
} else {
adjList[u].push_back(v);
adjList[v].push_back(u);
}
}
string tag, assemblyPoint;
cin >> tag >> assemblyPoint;
adjList[assemblyPoint];
for (auto const& pair : adjList) {
visited[pair.first] = false;
dist[pair.first] = -1;
}
queue<string> q;
dist[assemblyPoint] = 0;
visited[assemblyPoint] = true;
q.push(assemblyPoint);
while (!q.empty()) {
string current = q.front();
q.pop();
for (const string& neighbor : adjList[current]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
dist[neighbor] = dist[current] + 1;
parent[neighbor] = current;
q.push(neighbor);
}
}
}
for (auto const& pair : adjList) {
string point = pair.first;
if (point == assemblyPoint) continue;
if (!visited[point]) {
cout << "Point: " << point << " Reachable: No Steps: - Route: No path exists\n";
} else {
cout << "Point: " << point << " Reachable: Yes Steps: " << dist[point] << " Route: ";
string curr = point;
while (curr != assemblyPoint) {
cout << curr << " -> ";
curr = parent[curr];
}
cout << assemblyPoint << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7CiAgICBpbnQgbiwgbTsKICAgIAogICAgaWYgKCEoY2luID4+IG4gPj4gbSkpIHJldHVybiAwOwoKICAgIG1hcDxzdHJpbmcsIHZlY3RvcjxzdHJpbmc+PiBhZGpMaXN0OwogICAgbWFwPHN0cmluZywgaW50PiBkaXN0OwogICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJlbnQ7CiAgICBtYXA8c3RyaW5nLCBib29sPiB2aXNpdGVkOyAKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIHN0cmluZyB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CgogICAgICAgIGlmICh1ID09IHYpIHsKICAgICAgICAgICAgYWRqTGlzdFt1XTsgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWRqTGlzdFt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgICAgIGFkakxpc3Rbdl0ucHVzaF9iYWNrKHUpOyAKICAgICAgICB9CiAgICB9CgogICAgc3RyaW5nIHRhZywgYXNzZW1ibHlQb2ludDsKICAgIGNpbiA+PiB0YWcgPj4gYXNzZW1ibHlQb2ludDsgCiAgICBhZGpMaXN0W2Fzc2VtYmx5UG9pbnRdOyAgICAgIAoKICAgIGZvciAoYXV0byBjb25zdCYgcGFpciA6IGFkakxpc3QpIHsKICAgICAgICB2aXNpdGVkW3BhaXIuZmlyc3RdID0gZmFsc2U7CiAgICAgICAgZGlzdFtwYWlyLmZpcnN0XSA9IC0xOwogICAgfQoKICAgIHF1ZXVlPHN0cmluZz4gcTsKICAgIGRpc3RbYXNzZW1ibHlQb2ludF0gPSAwOwogICAgdmlzaXRlZFthc3NlbWJseVBvaW50XSA9IHRydWU7CiAgICBxLnB1c2goYXNzZW1ibHlQb2ludCk7CgogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBzdHJpbmcgY3VycmVudCA9IHEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwoKICAgICAgICBmb3IgKGNvbnN0IHN0cmluZyYgbmVpZ2hib3IgOiBhZGpMaXN0W2N1cnJlbnRdKSB7CiAgICAgICAgICAgIGlmICghdmlzaXRlZFtuZWlnaGJvcl0pIHsKICAgICAgICAgICAgICAgIHZpc2l0ZWRbbmVpZ2hib3JdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGRpc3RbbmVpZ2hib3JdID0gZGlzdFtjdXJyZW50XSArIDE7CiAgICAgICAgICAgICAgICBwYXJlbnRbbmVpZ2hib3JdID0gY3VycmVudDsKICAgICAgICAgICAgICAgIHEucHVzaChuZWlnaGJvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yIChhdXRvIGNvbnN0JiBwYWlyIDogYWRqTGlzdCkgewogICAgICAgIHN0cmluZyBwb2ludCA9IHBhaXIuZmlyc3Q7CgogICAgICAgIGlmIChwb2ludCA9PSBhc3NlbWJseVBvaW50KSBjb250aW51ZTsgCgogICAgICAgIGlmICghdmlzaXRlZFtwb2ludF0pIHsKICAgICAgICAgICAgY291dCA8PCAiUG9pbnQ6ICIgPDwgcG9pbnQgPDwgIiBSZWFjaGFibGU6IE5vIFN0ZXBzOiAtIFJvdXRlOiBObyBwYXRoIGV4aXN0c1xuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb3V0IDw8ICJQb2ludDogIiA8PCBwb2ludCA8PCAiIFJlYWNoYWJsZTogWWVzIFN0ZXBzOiAiIDw8IGRpc3RbcG9pbnRdIDw8ICIgUm91dGU6ICI7CiAgICAgICAgICAgIAogICAgICAgICAgICBzdHJpbmcgY3VyciA9IHBvaW50OwogICAgICAgICAgICB3aGlsZSAoY3VyciAhPSBhc3NlbWJseVBvaW50KSB7CiAgICAgICAgICAgICAgICBjb3V0IDw8IGN1cnIgPDwgIiAtPiAiOwogICAgICAgICAgICAgICAgY3VyciA9IHBhcmVudFtjdXJyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0IDw8IGFzc2VtYmx5UG9pbnQgPDwgIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=