//递归暴力解
#include <iostream>
using namespace std;
int n, m;
string list[100];
int dfs(char a, char b, int deep) {
for (int i = 0; i < n; i++) {
if (a == list[i][0]) {
if (b == list[i][1] || b == list[i][2])
return deep;
int i1 = dfs(list[i][1], b, deep + 1);
int i2 = dfs(list[i][2], b, deep + 1);
return i1 > i2 ? i1 : i2;
}
}
return 0;
}
int main() {
while (cin >> n >> m) { // 注意 while 处理多个 case
for (int i = 0; i < n; i++) {
cin >> list[i];
}
for (int i = 0; i < m; i++) {
char a, b;
cin >> a >> b;
int i1 = -dfs(a, b, 1);
int i2 = dfs(b, a, 1);
int deep = i1 != 0 ? i1 : i2;
switch (deep) {
case 0:
cout << "-" << endl;
break;
case 1:
cout << "parent" << endl;
break;
case -1:
cout << "child" << endl;
break;
case 2:
cout << "grandparent" << endl;
break;
case -2:
cout << "grandchild" << endl;
break;
default:
for (int p = 2; p < abs(deep); p++) {
cout << "great-";
}
if (deep > 0)
cout << "grandparent" << endl;
else
cout << "grandchild" << endl;
}
}
}
}
// 64 位输出请用 printf("%lld")