#include<bits/stdc++.h>
using namespace std;
typedef struct Privilege{
string category;
int level;
};
vector<Privilege> p_v;
map<string, vector<Privilege> > Role;
map<string, vector<Privilege> > User;
void p_make(string& s, int& x)
{
int len = s.size(), i;
for(i = 0; i < len; i++){
if(s[i] == ':')
break;
}
if(i != len)
x = s[len-1] - '0';
else
x = -1;
s = s.substr(0, i);
}
bool solve(string user, string pri, int &x)
{
x = -1;
int xx;
p_make(pri, xx);
if(User.find(user) == User.end())
return false;
vector<Privilege> v = User[user];
for(int i = 0; i < v.size(); i++){
if(v[i].category == pri){
if(xx > v[i].level)
return false;
if(v[i].level != -1&& xx == -1)
x = v[i].level;
return true;
}
}
return false;
}
int main()
{
int p, r, u, q;
cin >> p;
getchar();
while(p--){
string s1;
getline(cin, s1);
int x1;
p_make(s1, x1);
Privilege p1;
p1.category = s1, p1.level = x1;
p_v.push_back(p1);
}
cin >> r;
while(r--){
string role, s2;
cin >> role;
int s, x2;
cin >> s;
vector<Privilege> v;
for(int i = 0; i < s; i++){
cin >> s2;
p_make(s2, x2);
Privilege p2;
p2.category = s2, p2.level = x2;
v.push_back(p2);
}
Role.insert(make_pair(role, v));
}
cin >> u;
while(u--){
string user, s3;
cin >> user;
int t, x3;
cin >> t;
vector<Privilege> v;
for(int i = 0; i < t; i++){
cin >> s3;
vector<Privilege> v1 = Role[s3];
int ii, jj;
for(ii = 0; ii < v1.size(); ii++){
for(jj = 0; jj < v.size(); jj++){
if(v1[ii].category == v[jj].category){
if(v1[ii].level > v[jj].level)
v[jj].level = v1[ii].level;
break;
}
}
if(jj == v.size())
v.push_back(v1[ii]);
}
}
User.insert(make_pair(user, v));
}
cin >> q;
while(q--){
string s1, s2;
cin >> s1 >> s2;
int x;
int flag = solve(s1, s2, x);
if(x == -1){
if(flag) cout << "true" << endl;
else cout << "false" << endl;
}
else
cout << x << endl;
}
return 0;
}