#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#define pp pair<int,int>
#define MAX_D 1000000001
#define N 10000
using namespace std;
class Prioritize
{
public:
int operator() ( const pair<int, int>& p1, const pair<int, int>& p2 )
{
return p1.second > p2.second;
}
};
bool visited[N+1];
char city[15],startCity[15],destCity[15];
int main()
{
int t,i,j,queries;
scanf("%d",&t);
while(t--)
{
priority_queue<pp, vector<pp > , Prioritize > Q;
map<string,int>myMap;
map<string,int>:: iterator it;
int n,e;
int u,v,w;
scanf("%d",&n);
vector< pp > G[n+1];
for(i=1;i<=n;i++)
{
scanf("%s",city);
myMap.insert(pair<string,int>(city,i));
scanf("%d",&e);
for(j=1;j<=e;j++)
{
scanf("%d %d",&v,&w);
G[i].push_back(pp(v,w));
}
}
int s,dest;
int d[n+1];
for(int i=1;i<=n;i++)
{
d[i] = MAX_D;
visited[i]=false;
}
scanf("%d",&queries);
while(queries--)
{
scanf("%s %s",startCity,destCity);
it=myMap.find(startCity);
s=it->second;
it=myMap.find(destCity);
dest=it->second;
d[s] = 0;
Q.push(pp(s,d[s]));
while(!Q.empty())
{
u = Q.top().first;
w = Q.top().second;
if(u==dest)break; /*as only shortest distance to one point is desired */
if(visited[u])continue;
Q.pop();
if(w > d[u]) continue;
int size = G[u].size();
for(int i = 0 ; i < size ; i++)
{
v = G[u][i].first;
w = G[u][i].second;
if(!visited[v] && (d[v] > d[u] + w))
{
d[v] = d[u] + w;
Q.push(pp(v,d[v]));
}
}
}
printf("%d\n",d[dest]);
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgoKI2RlZmluZSBwcCBwYWlyPGludCxpbnQ+CiNkZWZpbmUgTUFYX0QgMTAwMDAwMDAwMQojZGVmaW5lIE4gMTAwMDAKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBQcmlvcml0aXplCnsKcHVibGljOgogICAgaW50IG9wZXJhdG9yKCkgKCBjb25zdCBwYWlyPGludCwgaW50PiYgcDEsIGNvbnN0IHBhaXI8aW50LCBpbnQ+JiBwMiApCiAgICB7CiAgICAgICAgcmV0dXJuIHAxLnNlY29uZCA+IHAyLnNlY29uZDsKICAgIH0KfTsKCmJvb2wgdmlzaXRlZFtOKzFdOwoKY2hhciBjaXR5WzE1XSxzdGFydENpdHlbMTVdLGRlc3RDaXR5WzE1XTsKaW50IG1haW4oKQp7CiAgICAgICAgaW50IHQsaSxqLHF1ZXJpZXM7CiAgICAgICAgc2NhbmYoIiVkIiwmdCk7CiAgICAgICAgd2hpbGUodC0tKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW9yaXR5X3F1ZXVlPHBwLCB2ZWN0b3I8cHAgPiAsIFByaW9yaXRpemUgPiBROwogICAgICAgICAgICAgICAgbWFwPHN0cmluZyxpbnQ+bXlNYXA7CgkJCQltYXA8c3RyaW5nLGludD46OiBpdGVyYXRvciBpdDsKICAgICAgICAgICAgICAgIGludCBuLGU7CiAgICAgICAgICAgICAgICBpbnQgdSx2LHc7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZuKTsKICAgICAgICAgICAgICAgIHZlY3RvcjwgcHAgPiBHW24rMV07CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvcihpPTE7aTw9bjtpKyspCiAgICAgICAgICAgICAgICB7CgkJCQkJc2NhbmYoIiVzIixjaXR5KTsKCQkJCQlteU1hcC5pbnNlcnQocGFpcjxzdHJpbmcsaW50PihjaXR5LGkpKTsKCQkJCQlzY2FuZigiJWQiLCZlKTsKCQkJCQlmb3Ioaj0xO2o8PWU7aisrKQoJCQkJCXsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkICVkIiwmdiwmdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEdbaV0ucHVzaF9iYWNrKHBwKHYsdykpOwoJCQkJCX0KCQkJCX0KICAgICAgICAgICAgICAgIGludCBzLGRlc3Q7CiAgICAgICAgICAgICAgICBpbnQgZFtuKzFdOwoJCQkJZm9yKGludCBpPTE7aTw9bjtpKyspCgkJCQl7CiAgICAgICAgICAgICAgICAgICAgIGRbaV0gPSBNQVhfRDsKICAgICAgICAgICAgICAgICAgICAgdmlzaXRlZFtpXT1mYWxzZTsKCQkJCX0KICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsJnF1ZXJpZXMpOwogICAgICAgICAgICAgICAgd2hpbGUocXVlcmllcy0tKQogICAgICAgICAgICAgICAgewoJCQkJCXNjYW5mKCIlcyAlcyIsc3RhcnRDaXR5LGRlc3RDaXR5KTsKCQkJCQkKCQkJCQlpdD1teU1hcC5maW5kKHN0YXJ0Q2l0eSk7CgkJCQkJcz1pdC0+c2Vjb25kOwoJCQkJCQoJCQkJCWl0PW15TWFwLmZpbmQoZGVzdENpdHkpOwoJCQkJCWRlc3Q9aXQtPnNlY29uZDsKCQkJCQkKCQkJCQkKCQkJCQlkW3NdID0gMDsKCQkJCQlRLnB1c2gocHAocyxkW3NdKSk7CgkJCQkJd2hpbGUoIVEuZW1wdHkoKSkKCQkJCQl7CgkJCQkJCQl1ID0gUS50b3AoKS5maXJzdDsKCQkJCQkJCXcgPSBRLnRvcCgpLnNlY29uZDsKCQkJCQkJCQoJCQkJCQkJaWYodT09ZGVzdClicmVhazsgLyphcyBvbmx5IHNob3J0ZXN0IGRpc3RhbmNlIHRvIG9uZSBwb2ludCBpcyBkZXNpcmVkICovCgkJCQkJCQlpZih2aXNpdGVkW3VdKWNvbnRpbnVlOwoJCQkJCQkJUS5wb3AoKTsKCQkJCQkJCWlmKHcgPiBkW3VdKSBjb250aW51ZTsKCQkJCQkJCQoJCQkJCQkJaW50IHNpemUgPSBHW3VdLnNpemUoKTsKCQkJCQkJCWZvcihpbnQgaSA9IDAgOyBpIDwgc2l6ZSA7IGkrKykKCQkJCQkJCXsKCQkJCQkJCQkJdiA9IEdbdV1baV0uZmlyc3Q7CgkJCQkJCQkJCXcgPSBHW3VdW2ldLnNlY29uZDsKCQkJCQkJCQkJaWYoIXZpc2l0ZWRbdl0gJiYgKGRbdl0gPiBkW3VdICsgdykpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCQlkW3ZdID0gZFt1XSArIHc7CgkJCQkJCQkJCQkJUS5wdXNoKHBwKHYsZFt2XSkpOwoJCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQl9CgkJCQkJcHJpbnRmKCIlZFxuIixkW2Rlc3RdKTsKCQkJCX0KCQl9CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKfQo=