#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
const int M = 50;
char nodes[M][30];
int pos_node = 0;
std::vector<int> adjacent_nodes[M];
void init() {
pos_node = 0;
for (int i = 0; i < M; ++i) adjacent_nodes[i].clear();
}
int get_node() {
char name[30];
scanf("%s", name);
for (int i = 0; i < pos_node; ++i)
if (!strcmp(name, nodes[i]))
return i;
strcpy(nodes[pos_node++], name);
return pos_node-1;
}
bool bfs(int source, int sink, std::vector<int> & path) {
int enqueued[M], prev[M], distance[M];
memset(enqueued, false, sizeof(enqueued));
memset(distance, 0, sizeof(distance));
std::queue<int> queue;
queue.push(source); enqueued[source] = true; prev[source] = source; distance[source] = 0;
while (not queue.empty()) {
int cur = queue.front(); queue.pop();
if (cur == sink) break;
for (auto next : adjacent_nodes[cur]) {
if (not enqueued[next]) {
queue.push(next); enqueued[next] = true; prev[next] = cur; distance[next] = distance[cur]+1;
}
}
}
path.clear();
if (not enqueued[sink]) return 0;
int now = sink;
while (prev[now] != now) {
path.push_back(now);
now = prev[now];
}
path.push_back(source);
std::reverse(path.begin(), path.end());
return true;
}
void print_path(const std::vector<int> & path) {
for (int i = 0; i < path.size(); ++i) {
printf("%s%s", i != 0 ? " -> " : "", nodes[path[i]]);
}
printf("\n");
}
int main() {
init();
int n_node;
scanf("%d", &n_node);
for (int i = 0; i < n_node; ++i) {
int from = get_node();
int n_next;
scanf("%d", &n_next);
while (n_next--) {
int to = get_node();
adjacent_nodes[from].push_back(to);
}
}
int n_query;
scanf("%d", &n_query);
while (n_query--) {
std::vector<int> path;
int from = get_node(), to = get_node();
if (bfs(from, to, path))
print_path(path);
else
printf("There is no path from %s -> %s\n", nodes[from], nodes[to]);
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCmNvbnN0IGludCBNID0gNTA7CmNoYXIgbm9kZXNbTV1bMzBdOwoKaW50IHBvc19ub2RlID0gMDsKc3RkOjp2ZWN0b3I8aW50PiBhZGphY2VudF9ub2Rlc1tNXTsKCnZvaWQgaW5pdCgpIHsKICAgIHBvc19ub2RlID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgKytpKSBhZGphY2VudF9ub2Rlc1tpXS5jbGVhcigpOwp9CgppbnQgZ2V0X25vZGUoKSB7CiAgICBjaGFyIG5hbWVbMzBdOwogICAgc2NhbmYoIiVzIiwgbmFtZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc19ub2RlOyArK2kpCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgbm9kZXNbaV0pKQogICAgICAgICAgICByZXR1cm4gaTsKICAgIHN0cmNweShub2Rlc1twb3Nfbm9kZSsrXSwgbmFtZSk7CiAgICByZXR1cm4gcG9zX25vZGUtMTsKfQoKYm9vbCBiZnMoaW50IHNvdXJjZSwgaW50IHNpbmssIHN0ZDo6dmVjdG9yPGludD4gJiBwYXRoKSB7CiAgICBpbnQgZW5xdWV1ZWRbTV0sIHByZXZbTV0sIGRpc3RhbmNlW01dOwogICAgbWVtc2V0KGVucXVldWVkLCBmYWxzZSwgc2l6ZW9mKGVucXVldWVkKSk7CiAgICBtZW1zZXQoZGlzdGFuY2UsIDAsIHNpemVvZihkaXN0YW5jZSkpOwoKICAgIHN0ZDo6cXVldWU8aW50PiBxdWV1ZTsKICAgIHF1ZXVlLnB1c2goc291cmNlKTsgZW5xdWV1ZWRbc291cmNlXSA9IHRydWU7IHByZXZbc291cmNlXSA9IHNvdXJjZTsgZGlzdGFuY2Vbc291cmNlXSA9IDA7CiAgICB3aGlsZSAobm90IHF1ZXVlLmVtcHR5KCkpIHsKICAgICAgICBpbnQgY3VyID0gcXVldWUuZnJvbnQoKTsgcXVldWUucG9wKCk7CiAgICAgICAgaWYgKGN1ciA9PSBzaW5rKSBicmVhazsKICAgICAgICBmb3IgKGF1dG8gbmV4dCA6IGFkamFjZW50X25vZGVzW2N1cl0pIHsKICAgICAgICAgICAgaWYgKG5vdCBlbnF1ZXVlZFtuZXh0XSkgewogICAgICAgICAgICAgICAgcXVldWUucHVzaChuZXh0KTsgZW5xdWV1ZWRbbmV4dF0gPSB0cnVlOyBwcmV2W25leHRdID0gY3VyOyBkaXN0YW5jZVtuZXh0XSA9IGRpc3RhbmNlW2N1cl0rMTsgCiAgICAgICAgICAgIH0gICAgIAogICAgICAgIH0KICAgIH0KCiAgICBwYXRoLmNsZWFyKCk7CiAgICBpZiAobm90IGVucXVldWVkW3NpbmtdKSByZXR1cm4gMDsKCiAgICBpbnQgbm93ID0gc2luazsKICAgIHdoaWxlIChwcmV2W25vd10gIT0gbm93KSB7CiAgICAgICAgcGF0aC5wdXNoX2JhY2sobm93KTsKICAgICAgICBub3cgPSBwcmV2W25vd107CiAgICB9CiAgICBwYXRoLnB1c2hfYmFjayhzb3VyY2UpOwogICAgc3RkOjpyZXZlcnNlKHBhdGguYmVnaW4oKSwgcGF0aC5lbmQoKSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBwcmludF9wYXRoKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gJiBwYXRoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGguc2l6ZSgpOyArK2kpIHsKICAgICAgICBwcmludGYoIiVzJXMiLCBpICE9IDAgPyAiIC0+ICIgOiAiIiwgbm9kZXNbcGF0aFtpXV0pOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgbWFpbigpIHsKICAgIGluaXQoKTsKCiAgICBpbnQgbl9ub2RlOwogICAgc2NhbmYoIiVkIiwgJm5fbm9kZSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX25vZGU7ICsraSkgewogICAgICAgIGludCBmcm9tID0gZ2V0X25vZGUoKTsKICAgICAgICBpbnQgbl9uZXh0OwogICAgICAgIHNjYW5mKCIlZCIsICZuX25leHQpOwogICAgICAgIHdoaWxlIChuX25leHQtLSkgewogICAgICAgICAgICBpbnQgdG8gPSBnZXRfbm9kZSgpOwogICAgICAgICAgICBhZGphY2VudF9ub2Rlc1tmcm9tXS5wdXNoX2JhY2sodG8pOwogICAgICAgIH0KICAgIH0KICAgIGludCBuX3F1ZXJ5OwogICAgc2NhbmYoIiVkIiwgJm5fcXVlcnkpOwogICAgd2hpbGUgKG5fcXVlcnktLSkgewogICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKICAgICAgICBpbnQgZnJvbSA9IGdldF9ub2RlKCksIHRvID0gZ2V0X25vZGUoKTsKICAgICAgICBpZiAoYmZzKGZyb20sIHRvLCBwYXRoKSkgCiAgICAgICAgICAgIHByaW50X3BhdGgocGF0aCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYoIlRoZXJlIGlzIG5vIHBhdGggZnJvbSAlcyAtPiAlc1xuIiwgbm9kZXNbZnJvbV0sIG5vZGVzW3RvXSk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9Cg==