#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1e3+5;
struct Edge{
int from,to,cap,flow;
Edge(int a,int b,int c,int d):from(a),to(b),cap(c),flow(d){
}
};
struct X{
char a[100],b[100];
}d[maxn],ap[maxn],rp[maxn];
vector<int> G[maxn];
vector<Edge> edges;
int a[maxn];
int p[maxn];
int S=0,ST=0;
#define INF 0x3f3f3f3f
int A,B,C;
void EK(){
int flow=0;
while(1){
queue<int> que;que.push(S);
memset(a,0,sizeof(a));
a[S]=INF;
while(!que.empty()){
int x=que.front();que.pop();
for(int i=0;i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(!a[e.to]&&e.cap>e.flow){
p[e.to]=G[x][i];
a[e.to]=min(a[x],e.cap-e.flow);
que.push(e.to);
}
}
if(a[ST])break;
}
if(!a[ST])break;
for(int u=ST;u!=S;u=edges[p[u]].from){
edges[p[u]].flow+=a[ST];
edges[p[u]^1].flow-=a[ST];
}
flow+=a[ST];
}
printf("%d\n",B-flow);
}
void add_edge(int from,int to,int cap){
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
G[from].push_back(edges.size()-2);
G[to].push_back(edges.size()-1);
}
void init(){
for(int i=0;i<ST;i++)
G[i].clear();
edges.clear();
}
int main(){
int T;scanf("%d",&T);
while(T--){
init();
scanf("%d",&A);
for(int i=1;i<=A;i++)
scanf("%s",d[i].a);
scanf("%d",&B);
for(int i=1;i<=B;i++)
scanf("%s%s",&ap[i].a,&ap[i].b);
scanf("%d",&C);
for(int i=1;i<=C;i++)
scanf("%s%s",&rp[i].a,&rp[i].b);
S=0,ST=A+B+C+1;
for(int i=1;i<=B;i++){
add_edge(S,A+i,1);
for(int j=1;j<=A;j++)
if(!strcmp(ap[i].b,d[j].a))
add_edge(A+i,j,1);
for(int j=1;j<=C;j++)
if(!strcmp(ap[i].b,rp[j].a))
add_edge(A+i,A+B+j,INF);
}
for(int i=1;i<=C;i++){
for(int j=1;j<=C;j++)
if(i!=j&&!strcmp(rp[i].b,rp[j].a))
add_edge(A+B+i,A+B+j,INF);
for(int j=1;j<=A;j++)
if(!strcmp(rp[i].b,d[j].a))
add_edge(A+B+i,j,INF);
}
for(int i=1;i<=A;i++)
add_edge(i,ST,1);
EK();
if(T)printf("\n");
}
return 0;
}
//另附大神解题报告
http://www.cnblogs.com/scau20110726/archive/2012/12/21/2828671.html