#include<bits/stdc++.h>
#define pii pair<int,int>
#define s(x) scanf("%d",&x)
#define INF (1<<20)
#define MAX 10000
using namespace std;
int d[MAX+5];
vector<pii> G[MAX];
struct comp {
//priority queue has priority according to distance
bool operator() (const pii &a, const pii &b) {
return a.second > b.second;
}
};
void addedge(int u, int v, int w)
{
G[u].push_back(make_pair(v,w));
}
void dijkstra(int root,int des)
{
d[root]=0;
int u,v,w;
vector<pii> :: iterator it;
priority_queue<pii,vector<pii>,comp> Q;
Q.push(pii(root,0));
while(!Q.empty())
{
u=Q.top().first;
if(u==des)
break;
Q.pop();
for(it=G[u].begin(); it!=G[u].end(); it++)
{
v=(*it).first;
w=(*it).second;
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
Q.push(pii(v,d[v]));
}
}
}
}
int main()
{
int t,n,p,nr,cost,t1;
map<string,int> m;
string s,s1,s2;
s(t);
while(t--)
{
s(n);
for(int i=0; i<n; i++)
{
cin>>s;
m.insert(make_pair(s,i));
s(p);
while(p--)
{
s(nr);
s(cost);
addedge(i,nr-1,cost);
}
}
s(t1);
while(t1--)
{
cin>>s1>>s2;
dijkstra(m[s1],m[s2]);
cout<<d[m[s2]]<<endl;
for(int i=0; i<n; i++)
d[i]=INF;
}
m.clear();
for(int i=0; i<n; i++)
G[i].clear();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBwaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHMoeCkgc2NhbmYoIiVkIiwmeCkKI2RlZmluZSBJTkYgKDE8PDIwKQojZGVmaW5lIE1BWCAxMDAwMAp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgZFtNQVgrNV07CnZlY3RvcjxwaWk+IEdbTUFYXTsKc3RydWN0IGNvbXAgewogICAgLy9wcmlvcml0eSBxdWV1ZSBoYXMgcHJpb3JpdHkgYWNjb3JkaW5nIHRvIGRpc3RhbmNlCiAgICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IHBpaSAmYSwgY29uc3QgcGlpICZiKSB7CiAgICAgICAgcmV0dXJuIGEuc2Vjb25kID4gYi5zZWNvbmQ7CiAgICB9Cn07CnZvaWQgYWRkZWRnZShpbnQgdSwgaW50IHYsIGludCB3KQp7CiAgICBHW3VdLnB1c2hfYmFjayhtYWtlX3BhaXIodix3KSk7Cn0Kdm9pZCBkaWprc3RyYShpbnQgcm9vdCxpbnQgZGVzKQp7CiAgICBkW3Jvb3RdPTA7CiAgICBpbnQgdSx2LHc7CiAgICB2ZWN0b3I8cGlpPiA6OiBpdGVyYXRvciBpdDsKICAgIHByaW9yaXR5X3F1ZXVlPHBpaSx2ZWN0b3I8cGlpPixjb21wPiBROwogICAgUS5wdXNoKHBpaShyb290LDApKTsKICAgIHdoaWxlKCFRLmVtcHR5KCkpCiAgICB7CiAgICAgICAgdT1RLnRvcCgpLmZpcnN0OwogICAgICAgIGlmKHU9PWRlcykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgUS5wb3AoKTsKICAgICAgICBmb3IoaXQ9R1t1XS5iZWdpbigpOyBpdCE9R1t1XS5lbmQoKTsgaXQrKykKICAgICAgICB7CiAgICAgICAgICAgIHY9KCppdCkuZmlyc3Q7CiAgICAgICAgICAgIHc9KCppdCkuc2Vjb25kOwogICAgICAgICAgICBpZihkW3ZdPmRbdV0rdykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZFt2XT1kW3VdK3c7CiAgICAgICAgICAgICAgICBRLnB1c2gocGlpKHYsZFt2XSkpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICB9Cgp9CmludCBtYWluKCkKewogICAgaW50IHQsbixwLG5yLGNvc3QsdDE7CiAgICBtYXA8c3RyaW5nLGludD4gbTsKICAgIHN0cmluZyBzLHMxLHMyOwogICAgcyh0KTsKICAgIHdoaWxlKHQtLSkKICAgIHsKICAgICAgICBzKG4pOwogICAgICAgIAogICAgICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+czsKICAgICAgICAgICAgbS5pbnNlcnQobWFrZV9wYWlyKHMsaSkpOwogICAgICAgICAgICBzKHApOwogICAgICAgICAgICB3aGlsZShwLS0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHMobnIpOwogICAgICAgICAgICAgICAgcyhjb3N0KTsKICAgICAgICAgICAgICAgIGFkZGVkZ2UoaSxuci0xLGNvc3QpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBzKHQxKTsKICAgICAgICB3aGlsZSh0MS0tKQogICAgICAgIHsKICAgICAgICAgICAgY2luPj5zMT4+czI7CiAgICAgICAgICAgIGRpamtzdHJhKG1bczFdLG1bczJdKTsKICAgICAgICAgICAgY291dDw8ZFttW3MyXV08PGVuZGw7CiAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykKICAgICAgICAgICAgZFtpXT1JTkY7CiAgICAgICAgfQogICAgICAgIG0uY2xlYXIoKTsKICAgICAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspCiAgICAgICAgICAgIEdbaV0uY2xlYXIoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==