#include<bits/stdc++.h>
using namespace std;
#define MAX 10000000
typedef pair<int, int> pi;
class Graph
{
private:
int v;
list<int>* adj;
map<pair<int,int>,int> mp;
public:
Graph(int n)
{
v=n;
adj=new list<int> [v+1];
}
void addEdge(int a,int b,int w)
{
adj[a].push_back(b);
mp[{a,b}]=w;
}
int dijkstra(int,int);
};
int Graph::dijkstra(int a,int b)
{
int i,j,u,temp;
priority_queue<pi, vector<pi>, greater<pi> > pq;
int dist[v+1],visited[v+1]={};
for(i=1;i<=v;i++){
dist[i]=MAX;
}
dist[a]=0;
pq.push(make_pair(0,a));
list<int>::iterator it;
while(!pq.empty()){
//u=extract_min(visited,dist,v);
u=pq.top().second;
pq.pop();
visited[u]=1;
for(it=adj[u].begin();it!=adj[u].end();it++){
//relax(u,*it,mp[{u,*it}],dist);
temp=dist[u]+mp[{u,*it}];
if(dist[*it]>temp){
dist[*it]=temp;
if(visited[*it]==0)
pq.push(make_pair(temp,*it));
}
}
}
return dist[b];
}
int main()
{
int n,tc,p,nr,i,j,k,no_of_paths,cost;
string name,name1,name2;
map<string,int> mp1;
cin>>tc;
for(i=0;i<tc;i++){
cin>>n;
Graph g(n);
for(j=1;j<=n;j++){
cin>>name;
mp1[name]=j;
cin>>p;
for(k=0;k<p;k++){
cin>>nr>>cost;
g.addEdge(j,nr,cost);
}
}
cin>>no_of_paths;
for(k=0;k<no_of_paths;k++){
cin>>name1>>name2;
cout<<g.dijkstra(mp1[name1],mp1[name2])<<endl;
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVggMTAwMDAwMDAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaTsKY2xhc3MgR3JhcGgKewpwcml2YXRlOgogICAgaW50IHY7CiAgICBsaXN0PGludD4qIGFkajsKICAgIG1hcDxwYWlyPGludCxpbnQ+LGludD4gbXA7CnB1YmxpYzoKICAgIEdyYXBoKGludCBuKQogICAgewogICAgICAgIHY9bjsKICAgICAgICBhZGo9bmV3IGxpc3Q8aW50PiBbdisxXTsKICAgIH0KICAgIHZvaWQgYWRkRWRnZShpbnQgYSxpbnQgYixpbnQgdykKICAgIHsKICAgICAgICBhZGpbYV0ucHVzaF9iYWNrKGIpOwogICAgICAgIG1wW3thLGJ9XT13OwogICAgfQogICAgaW50IGRpamtzdHJhKGludCxpbnQpOwp9OwppbnQgR3JhcGg6OmRpamtzdHJhKGludCBhLGludCBiKQp7CiAgICBpbnQgaSxqLHUsdGVtcDsKICAgIHByaW9yaXR5X3F1ZXVlPHBpLCB2ZWN0b3I8cGk+LCBncmVhdGVyPHBpPiA+IHBxOwogICAgaW50IGRpc3RbdisxXSx2aXNpdGVkW3YrMV09e307CiAgICBmb3IoaT0xO2k8PXY7aSsrKXsKICAgICAgICBkaXN0W2ldPU1BWDsKICAgIH0KICAgIGRpc3RbYV09MDsKICAgIHBxLnB1c2gobWFrZV9wYWlyKDAsYSkpOwogICAgbGlzdDxpbnQ+OjppdGVyYXRvciBpdDsKICAgIHdoaWxlKCFwcS5lbXB0eSgpKXsKICAgICAgICAvL3U9ZXh0cmFjdF9taW4odmlzaXRlZCxkaXN0LHYpOwogICAgICAgIHU9cHEudG9wKCkuc2Vjb25kOwogICAgICAgIHBxLnBvcCgpOwogICAgICAgIHZpc2l0ZWRbdV09MTsKICAgICAgICBmb3IoaXQ9YWRqW3VdLmJlZ2luKCk7aXQhPWFkalt1XS5lbmQoKTtpdCsrKXsKICAgICAgICAgICAgLy9yZWxheCh1LCppdCxtcFt7dSwqaXR9XSxkaXN0KTsKICAgICAgICAgICAgdGVtcD1kaXN0W3VdK21wW3t1LCppdH1dOwogICAgICAgICAgICBpZihkaXN0WyppdF0+dGVtcCl7CiAgICAgICAgICAgICAgICBkaXN0WyppdF09dGVtcDsKICAgICAgICAgICAgICAgIGlmKHZpc2l0ZWRbKml0XT09MCkKICAgICAgICAgICAgICAgICAgICBwcS5wdXNoKG1ha2VfcGFpcih0ZW1wLCppdCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpc3RbYl07Cn0KaW50IG1haW4oKQp7CiAgICBpbnQgbix0YyxwLG5yLGksaixrLG5vX29mX3BhdGhzLGNvc3Q7CiAgICBzdHJpbmcgbmFtZSxuYW1lMSxuYW1lMjsKICAgIG1hcDxzdHJpbmcsaW50PiBtcDE7CiAgICBjaW4+PnRjOwogICAgZm9yKGk9MDtpPHRjO2krKyl7CiAgICAgICAgY2luPj5uOwogICAgICAgIEdyYXBoIGcobik7CiAgICAgICAgZm9yKGo9MTtqPD1uO2orKyl7CiAgICAgICAgICAgIGNpbj4+bmFtZTsKICAgICAgICAgICAgbXAxW25hbWVdPWo7CiAgICAgICAgICAgIGNpbj4+cDsKICAgICAgICAgICAgZm9yKGs9MDtrPHA7aysrKXsKICAgICAgICAgICAgICAgIGNpbj4+bnI+PmNvc3Q7CiAgICAgICAgICAgICAgICBnLmFkZEVkZ2Uoaixucixjb3N0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaW4+Pm5vX29mX3BhdGhzOwogICAgICAgIGZvcihrPTA7azxub19vZl9wYXRocztrKyspewogICAgICAgICAgICBjaW4+Pm5hbWUxPj5uYW1lMjsKICAgICAgICAgICAgY291dDw8Zy5kaWprc3RyYShtcDFbbmFtZTFdLG1wMVtuYW1lMl0pPDxlbmRsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==