#include<cstdio>
#include<algorithm>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
map<string,int> id;
int st,ed;
int cnt;
const int maxn=410;
const int inf=0x3f3f3f3f;
/*
要注意格式和数量,
因为有转换器,所以最多会有400种可能性
*/
struct Edge{
int u,v,cap,flow;
Edge(int _u,int _v,int c,int f):u(_u),v(_v),cap(c),flow(f){ }
};
struct EK{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
int a[maxn];
int p[maxn];
void init(int n){
for(int i=0;i<n;i++)G[i].clear();
edges.clear();
}
void add_edge(int u,int v,int c){
edges.push_back(Edge(u,v,c,0));
edges.push_back(Edge(v,u,0,0));
m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
int MaxFlow(int s,int t){
int flow=0;
for(;;){
memset(a,0,sizeof(a));
queue<int> q;
q.push(s);
a[s]=inf;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=0;i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(!a[e.v]&&e.cap>e.flow){
p[e.v]=G[x][i];
a[e.v]=min(a[x],e.cap-e.flow);
q.push(e.v);
}
}
if(a[t])break;
}
if(!a[t])break;
for(int u=t;u!=s;u=edges[p[u]].u){
edges[p[u]].flow+=a[t];
edges[p[u]^1].flow-=a[t];
}
flow+=a[t];
}
return flow;
}
}ek;
void init(){
id.clear();
cnt=0;
st=cnt++;
ed=cnt++;
ek.init(maxn-1);
}
int main(){
ios::sync_with_stdio(false);
int T;
int flag=0;
cin>>T;
while(T--){
init();
if(flag)cout<<endl;
flag++;
int n;
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
if(!id[s]) id[s]=cnt++;
ek.add_edge(id[s],ed,1);
}
int m;
cin>>m;
for(int i=1;i<=m;i++){
string s1,s2;
cin>>s1>>s2;
if(!id[s2]) id[s2]=cnt++;
ek.add_edge(st,id[s2],1);
}
int k;
cin>>k;
for(int i=1;i<=k;i++){
string s1,s2;
cin>>s1>>s2;
if(!id[s1]) id[s1]=cnt++;
if(!id[s2]) id[s2]=cnt++;
ek.add_edge(id[s1],id[s2],inf);
}
int ans=ek.MaxFlow(st,ed);
cout<<m-ans<<endl;
}
return 0;
}
09-21
09-21
09-21