#include<bits/stdc++.h>
using namespace std;
#define MAX 500000
typedef pair<int, int> pi;
class Graph
{
private:
int v;
vector<pair<int,int>>* adj;
public:
Graph(int n)
{
v=n;
adj=new vector<pair<int,int>> [v+1];
}
void addEdge(int a,int b,int w)
{
adj[a].push_back({b,w});
}
int dijkstra(int,int,vector<int>&);
};
int Graph::dijkstra(int a,int b,vector<int>&vec)
{
int i,j,u,temp,flag,it,siez;
priority_queue<pi,vector<pi>,greater<pi>> pq;
int dist[v+1];
bool visited[v+1];
for(i=1;i<=v;i++){
dist[i]=MAX;
visited[i]=false;
}
dist[a]=0;
pq.push(make_pair(0,a));
while(!pq.empty()){
u=pq.top().second;
pq.pop();
visited[u]=true;
for(it=0;it<adj[u].size();it++){
flag=adj[u][it].first;
siez=adj[u][it].second;
temp=dist[u]+siez;
if(dist[flag]>temp){
dist[flag]=temp;
if(visited[flag]==false)
pq.push(make_pair(temp,flag));
}
}
}
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;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
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;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVggNTAwMDAwCnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGk7CmNsYXNzIEdyYXBoCnsKcHJpdmF0ZToKICAgIGludCB2OwogICAgdmVjdG9yPHBhaXI8aW50LGludD4+KiBhZGo7CnB1YmxpYzoKICAgIEdyYXBoKGludCBuKQogICAgewogICAgICAgIHY9bjsKICAgICAgICBhZGo9bmV3IHZlY3RvcjxwYWlyPGludCxpbnQ+PiBbdisxXTsKICAgIH0KICAgIHZvaWQgYWRkRWRnZShpbnQgYSxpbnQgYixpbnQgdykKICAgIHsKICAgICAgICBhZGpbYV0ucHVzaF9iYWNrKHtiLHd9KTsKICAgIH0KICAgIGludCBkaWprc3RyYShpbnQsaW50LHZlY3RvcjxpbnQ+Jik7Cn07CmludCBHcmFwaDo6ZGlqa3N0cmEoaW50IGEsaW50IGIsdmVjdG9yPGludD4mdmVjKQp7CiAgICBpbnQgaSxqLHUsdGVtcCxmbGFnLGl0LHNpZXo7CiAgICBwcmlvcml0eV9xdWV1ZTxwaSx2ZWN0b3I8cGk+LGdyZWF0ZXI8cGk+PiBwcTsKICAgIGludCBkaXN0W3YrMV07CiAgICBib29sIHZpc2l0ZWRbdisxXTsKICAgIGZvcihpPTE7aTw9djtpKyspewogICAgICAgIGRpc3RbaV09TUFYOwogICAgICAgIHZpc2l0ZWRbaV09ZmFsc2U7CiAgICB9CiAgICBkaXN0W2FdPTA7CiAgICBwcS5wdXNoKG1ha2VfcGFpcigwLGEpKTsKICAgIHdoaWxlKCFwcS5lbXB0eSgpKXsKICAgICAgICB1PXBxLnRvcCgpLnNlY29uZDsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICB2aXNpdGVkW3VdPXRydWU7CiAgICAgICAgZm9yKGl0PTA7aXQ8YWRqW3VdLnNpemUoKTtpdCsrKXsKICAgICAgICAgICAgICAgIGZsYWc9YWRqW3VdW2l0XS5maXJzdDsKICAgICAgICAgICAgICAgIHNpZXo9YWRqW3VdW2l0XS5zZWNvbmQ7CiAgICAgICAgICAgIHRlbXA9ZGlzdFt1XStzaWV6OwogICAgICAgICAgICBpZihkaXN0W2ZsYWddPnRlbXApewogICAgICAgICAgICAgICAgZGlzdFtmbGFnXT10ZW1wOwogICAgICAgICAgICAgICAgaWYodmlzaXRlZFtmbGFnXT09ZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgcHEucHVzaChtYWtlX3BhaXIodGVtcCxmbGFnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IoaT0xO2k8PXY7aSsrKXsKICAgICAgICB2ZWMucHVzaF9iYWNrKGRpc3RbaV0pOwogICAgfQogICAgcmV0dXJuIGRpc3RbYl07Cn0KaW50IG1haW4oKQp7CiAgICBpbnQgbix0YyxwLG5yLGksaixrLG5vX29mX3BhdGhzLGNvc3Q7CiAgICBzdHJpbmcgbmFtZSxuYW1lMSxuYW1lMjsKICAgIG1hcDxzdHJpbmcsaW50PiBtcDE7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjaW4+PnRjOwogICAgZm9yKGk9MDtpPHRjO2krKyl7CiAgICAgICAgY2luPj5uOwogICAgICAgIEdyYXBoIGcobik7CiAgICAgICAgZm9yKGo9MTtqPD1uO2orKyl7CiAgICAgICAgICAgIGNpbj4+bmFtZTsKICAgICAgICAgICAgbXAxW25hbWVdPWo7CiAgICAgICAgICAgIGNpbj4+cDsKICAgICAgICAgICAgZm9yKGs9MDtrPHA7aysrKXsKICAgICAgICAgICAgICAgIGNpbj4+bnI+PmNvc3Q7CiAgICAgICAgICAgICAgICBnLmFkZEVkZ2Uoaixucixjb3N0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaW4+Pm5vX29mX3BhdGhzOwogICAgICAgIHZlY3RvcjxpbnQ+IHN0b3JlW25vX29mX3BhdGhzKzFdOwogICAgICAgIGZvcihrPTA7azxub19vZl9wYXRocztrKyspewogICAgICAgICAgICBjaW4+Pm5hbWUxPj5uYW1lMjsKICAgICAgICAgICAgaWYoc3RvcmVbbXAxW25hbWUxXV0uc2l6ZSgpIT0wKXsKICAgICAgICAgICAgICAgIGNvdXQ8PHN0b3JlW21wMVtuYW1lMV1dW21wMVtuYW1lMl0tMV08PGVuZGw7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0PDxnLmRpamtzdHJhKG1wMVtuYW1lMV0sbXAxW25hbWUyXSxzdG9yZVttcDFbbmFtZTFdXSk8PGVuZGw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0K