#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
struct CATE
{
string cate_name;
int level;
};
struct ROLE
{
string role_name;
int cn;
vector<CATE> cate;
};
struct USER
{
string user_name;
int rn;
vector<ROLE> role;
};
void Transform(string s, CATE& c)
{
int l = s.length(), i;
for(i=0; i<l && s[i] != ':'; i++)
continue;
c.cate_name = s.substr(0, i);
if(i == l) c.level = -1;
else if(l-i == 2 && s[l-1]>='0' && s[l-1]<='9') c.level = s[l-1] - '0';
else c.level = -2;
}
int main()
{
int p, r, u, q;
string s;
cin >> p;
CATE Cate[p];
for(int i=0; i<p; i++)
{
cin >> s;
Transform(s, Cate[i]);
}
cin >> r;
ROLE Role[r];
for(int i=0; i<r; i++)
{
cin >> Role[i].role_name >> Role[i].cn;
Role[i].cate = vector<CATE>(Role[i].cn);
for(int j=0; j<Role[i].cn; j++)
{
cin >> s;
Transform(s, Role[i].cate[j]);
}
}
cin >> u;
USER User[u];
for(int i=0; i<u; i++)
{
cin >> User[i].user_name >> User[i].rn;
for(int j=0; j<User[i].rn; j++)
{
cin >> s;
for(int t=0; t<r; t++)
if(Role[t].role_name == s)
{
User[i].role.push_back(Role[t]);
break;
}
}
}
cin >> q;
while(q--)
{
string name;
CATE query;
cin >> name >> s;
Transform(s, query);
bool cate_exist = false;
int UNO, CNO;
for(UNO=0; UNO<u && User[UNO].user_name != name; UNO++)
continue;
for(CNO=0; CNO<p && Cate[CNO].cate_name != query.cate_name; CNO++)
continue;
if(UNO >= u || CNO >= p || query.level == -2)
cout << "false" << endl;
else
{
int max_level = -2;
for(int i=0; i<User[UNO].rn; i++)
for(int j=0; j<User[UNO].role[i].cn; j++)
if(User[UNO].role[i].cate[j].cate_name == query.cate_name)
max_level = max(User[UNO].role[i].cate[j].level, max_level);
if(query.level == -1 && max_level > -1) cout << max_level << endl;
else if(max_level >= query.level) cout << "true" << endl;
else cout << "false" << endl;
}
}
}