#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,vector<int>&);
};
int Graph::dijkstra(int a,int b,vector<int>&vec)
{
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));
}
}
}
for(i=1;i<=v;i++){
vec.push_back(dist[i]);
}
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;
vector<int> store[no_of_paths+1];
for(k=0;k<no_of_paths;k++){
cin>>name1>>name2;
if(store[mp1[name1]].size()!=0){
cout<<store[mp1[name1]][mp1[name2]-1]<<endl;
continue;
}
cout<<g.dijkstra(mp1[name1],mp1[name2],store[mp1[name1]])<<endl;
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVggMTAwMDAwMDAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaTsKY2xhc3MgR3JhcGgKewpwcml2YXRlOgogICAgaW50IHY7CiAgICBsaXN0PGludD4qIGFkajsKICAgIG1hcDxwYWlyPGludCxpbnQ+LGludD4gbXA7CnB1YmxpYzoKICAgIEdyYXBoKGludCBuKQogICAgewogICAgICAgIHY9bjsKICAgICAgICBhZGo9bmV3IGxpc3Q8aW50PiBbdisxXTsKICAgIH0KICAgIHZvaWQgYWRkRWRnZShpbnQgYSxpbnQgYixpbnQgdykKICAgIHsKICAgICAgICBhZGpbYV0ucHVzaF9iYWNrKGIpOwogICAgICAgIG1wW3thLGJ9XT13OwogICAgfQogICAgaW50IGRpamtzdHJhKGludCxpbnQsdmVjdG9yPGludD4mKTsKfTsKaW50IEdyYXBoOjpkaWprc3RyYShpbnQgYSxpbnQgYix2ZWN0b3I8aW50PiZ2ZWMpCnsKICAgIGludCBpLGosdSx0ZW1wOwogICAgcHJpb3JpdHlfcXVldWU8cGksIHZlY3RvcjxwaT4sIGdyZWF0ZXI8cGk+ID4gcHE7CiAgICBpbnQgZGlzdFt2KzFdLHZpc2l0ZWRbdisxXT17fTsKICAgIGZvcihpPTE7aTw9djtpKyspewogICAgICAgIGRpc3RbaV09TUFYOwogICAgfQogICAgZGlzdFthXT0wOwogICAgcHEucHVzaChtYWtlX3BhaXIoMCxhKSk7CiAgICBsaXN0PGludD46Oml0ZXJhdG9yIGl0OwogICAgd2hpbGUoIXBxLmVtcHR5KCkpewogICAgICAgIC8vdT1leHRyYWN0X21pbih2aXNpdGVkLGRpc3Qsdik7CiAgICAgICAgdT1wcS50b3AoKS5zZWNvbmQ7CiAgICAgICAgcHEucG9wKCk7CiAgICAgICAgdmlzaXRlZFt1XT0xOwogICAgICAgIGZvcihpdD1hZGpbdV0uYmVnaW4oKTtpdCE9YWRqW3VdLmVuZCgpO2l0KyspewogICAgICAgICAgICAvL3JlbGF4KHUsKml0LG1wW3t1LCppdH1dLGRpc3QpOwogICAgICAgICAgICB0ZW1wPWRpc3RbdV0rbXBbe3UsKml0fV07CiAgICAgICAgICAgIGlmKGRpc3RbKml0XT50ZW1wKXsKICAgICAgICAgICAgICAgIGRpc3RbKml0XT10ZW1wOwogICAgICAgICAgICAgICAgaWYodmlzaXRlZFsqaXRdPT0wKQogICAgICAgICAgICAgICAgICAgIHBxLnB1c2gobWFrZV9wYWlyKHRlbXAsKml0KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IoaT0xO2k8PXY7aSsrKXsKICAgICAgICB2ZWMucHVzaF9iYWNrKGRpc3RbaV0pOwogICAgfQogICAgcmV0dXJuIGRpc3RbYl07Cn0KaW50IG1haW4oKQp7CiAgICBpbnQgbix0YyxwLG5yLGksaixrLG5vX29mX3BhdGhzLGNvc3Q7CiAgICBzdHJpbmcgbmFtZSxuYW1lMSxuYW1lMjsKICAgIG1hcDxzdHJpbmcsaW50PiBtcDE7CiAgICBjaW4+PnRjOwogICAgZm9yKGk9MDtpPHRjO2krKyl7CiAgICAgICAgY2luPj5uOwogICAgICAgIEdyYXBoIGcobik7CiAgICAgICAgZm9yKGo9MTtqPD1uO2orKyl7CiAgICAgICAgICAgIGNpbj4+bmFtZTsKICAgICAgICAgICAgbXAxW25hbWVdPWo7CiAgICAgICAgICAgIGNpbj4+cDsKICAgICAgICAgICAgZm9yKGs9MDtrPHA7aysrKXsKICAgICAgICAgICAgICAgIGNpbj4+bnI+PmNvc3Q7CiAgICAgICAgICAgICAgICBnLmFkZEVkZ2Uoaixucixjb3N0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaW4+Pm5vX29mX3BhdGhzOwogICAgICAgIHZlY3RvcjxpbnQ+IHN0b3JlW25vX29mX3BhdGhzKzFdOwogICAgICAgIGZvcihrPTA7azxub19vZl9wYXRocztrKyspewogICAgICAgICAgICBjaW4+Pm5hbWUxPj5uYW1lMjsKICAgICAgICAgICAgaWYoc3RvcmVbbXAxW25hbWUxXV0uc2l6ZSgpIT0wKXsKICAgICAgICAgICAgICAgIGNvdXQ8PHN0b3JlW21wMVtuYW1lMV1dW21wMVtuYW1lMl0tMV08PGVuZGw7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0PDxnLmRpamtzdHJhKG1wMVtuYW1lMV0sbXAxW25hbWUyXSxzdG9yZVttcDFbbmFtZTFdXSk8PGVuZGw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0K