#include <iostream>
#include <vector>
#include <cstdio>
#include <map>
#include <set>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 10010, inf = 800000;
vector <int> D(maxn);
vector < vector < pair<int,int> > > graph(maxn);
map <string,int> getByName;
int n;
void update()
{
}
int dijkstra(int start, int end)
{
set < pair <int,int> > Q;
D[start] = 0;
Q.insert( make_pair( D[start], start ) );
while( Q.empty() == false )
{
pair <int,int> pr = *Q.begin();
/*
if( pr.second == end )
return pr.first;
*/
Q.erase( Q.begin() );
for( vector < pair<int,int> >::iterator it = graph[ pr.second ].begin(); it != graph[ pr.second ].end(); it++ )
{
int to = it->first, cost = it->second;
if( D[to] > D[ pr.second ] + cost )
{
if( D[to] != inf )
Q.erase( Q.find( make_pair( D[to], to ) ) );
D[to] = D[ pr.second ] + cost;
Q.insert( make_pair( D[to], to ) );
}
}
}
return D[end];
}
void SHPATH()
{
getByName.clear();
graph.clear();
graph.resize(maxn);
int i, j, to, w, a, b, c, n1;
string str, str1;
char name[25], name1[25];
scanf("%d", &n);
for(i = 0; i < n; ++i)
{
scanf("%s", &name); str = name;
getByName[ str ] = i;
scanf("%d", &n1);
for(j = 0; j < n1; ++j)
{
scanf("%d%d", &to, &w);
graph[i].push_back( make_pair( to-1, w ) );
}
}
scanf("%d", &n1);
for(i = 0; i < n1; ++i)
{
D.clear();
D.resize(maxn,inf);
scanf("%s" , &name);
scanf("%s" , &name1);
str = name;
str1 = name1;
a = getByName[ str ];
b = getByName[ str1 ];
c = dijkstra(a, b);
printf("%d\n", c);
}
}
int main()
{
int testcase;
scanf("%d", &testcase);
while( testcase-- )
SHPATH();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heG4gPSAxMDAxMCwgaW5mID0gODAwMDAwOwoKdmVjdG9yIDxpbnQ+IEQobWF4bik7CnZlY3RvciA8IHZlY3RvciA8IHBhaXI8aW50LGludD4gPiA+IGdyYXBoKG1heG4pOwptYXAgPHN0cmluZyxpbnQ+IGdldEJ5TmFtZTsKaW50IG47Cgp2b2lkIHVwZGF0ZSgpCnsKCn0KCmludCBkaWprc3RyYShpbnQgc3RhcnQsIGludCBlbmQpCnsKCXNldCA8IHBhaXIgPGludCxpbnQ+ID4gUTsKCURbc3RhcnRdID0gMDsKCglRLmluc2VydCggbWFrZV9wYWlyKCBEW3N0YXJ0XSwgc3RhcnQgKSApOwoKCXdoaWxlKCBRLmVtcHR5KCkgPT0gZmFsc2UgKQoJewoJCXBhaXIgPGludCxpbnQ+IHByID0gKlEuYmVnaW4oKTsKLyoJCQoJCWlmKCBwci5zZWNvbmQgPT0gZW5kICkKCQkJcmV0dXJuIHByLmZpcnN0OwoqLwoJCVEuZXJhc2UoIFEuYmVnaW4oKSApOwoKCQlmb3IoIHZlY3RvciA8IHBhaXI8aW50LGludD4gPjo6aXRlcmF0b3IgaXQgPSBncmFwaFsgcHIuc2Vjb25kIF0uYmVnaW4oKTsgaXQgIT0gZ3JhcGhbIHByLnNlY29uZCBdLmVuZCgpOyBpdCsrICkKCQl7CgkJCWludCB0byA9IGl0LT5maXJzdCwgY29zdCA9IGl0LT5zZWNvbmQ7CgoJCQlpZiggRFt0b10gPiBEWyBwci5zZWNvbmQgXSArIGNvc3QgKQoJCQl7CgkJCQlpZiggRFt0b10gIT0gaW5mICkKCQkJCQlRLmVyYXNlKCBRLmZpbmQoIG1ha2VfcGFpciggRFt0b10sIHRvICkgKSApOwoJCQkJRFt0b10gPSBEWyBwci5zZWNvbmQgXSArIGNvc3Q7CgkJCQlRLmluc2VydCggbWFrZV9wYWlyKCBEW3RvXSwgdG8gKSApOwoJCQl9CgkJfQoJfQoJcmV0dXJuIERbZW5kXTsKfQoKdm9pZCBTSFBBVEgoKQp7CglnZXRCeU5hbWUuY2xlYXIoKTsKCWdyYXBoLmNsZWFyKCk7CglncmFwaC5yZXNpemUobWF4bik7CgoJaW50IGksIGosIHRvLCB3LCBhLCBiLCBjLCBuMTsKCXN0cmluZyBzdHIsIHN0cjE7CgljaGFyIG5hbWVbMjVdLCBuYW1lMVsyNV07CgkKCXNjYW5mKCIlZCIsICZuKTsKCglmb3IoaSA9IDA7IGkgPCBuOyArK2kpCgl7CgkJc2NhbmYoIiVzIiwgJm5hbWUpOyBzdHIgPSBuYW1lOwoJCWdldEJ5TmFtZVsgc3RyIF0gPSBpOwoKCQlzY2FuZigiJWQiLCAmbjEpOwoJCWZvcihqID0gMDsgaiA8IG4xOyArK2opCgkJewoJCQlzY2FuZigiJWQlZCIsICZ0bywgJncpOwoJCQlncmFwaFtpXS5wdXNoX2JhY2soIG1ha2VfcGFpciggdG8tMSwgdyApICk7CgkJfQoJfQoKCXNjYW5mKCIlZCIsICZuMSk7Cglmb3IoaSA9IDA7IGkgPCBuMTsgKytpKQoJewoJCUQuY2xlYXIoKTsKCQlELnJlc2l6ZShtYXhuLGluZik7CgoJCXNjYW5mKCIlcyIgLCAmbmFtZSk7CgkJc2NhbmYoIiVzIiAsICZuYW1lMSk7CgkJCgkJc3RyID0gbmFtZTsKCQlzdHIxID0gbmFtZTE7CgoJCWEgPSBnZXRCeU5hbWVbIHN0ciBdOwoJCWIgPSBnZXRCeU5hbWVbIHN0cjEgXTsKCQljID0gZGlqa3N0cmEoYSwgYik7CgkKCQlwcmludGYoIiVkXG4iLCBjKTsgCgoJfQp9CgppbnQgbWFpbigpCnsKCWludCB0ZXN0Y2FzZTsKCXNjYW5mKCIlZCIsICZ0ZXN0Y2FzZSk7CgoJd2hpbGUoIHRlc3RjYXNlLS0gKQoJCVNIUEFUSCgpOwoKCXJldHVybiAwOwp9