#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<map>
#include<queue>
#include<climits>
#include<cstdio>
using namespace std;
int cost[1002][1002];
int cap[1002][1002];
int fnet[1002][1002];
vector<int> adj[1005];
int pi[1005];
int d[1005];
int parent[1005];
int n;
int s;
int t;
int fcost;
//vector<pair<int, int> > ve;
int dijkstra()
{
memset(parent, -1, sizeof(parent));
for(int i = 0; i < 1005; i++)
d[i] = INT_MAX;
d[s] = 0;
priority_queue<pair<int , int> , std::vector<pair<int, int> >, std::greater<pair<int, int> > > q;
q.push(make_pair(d[s], s));
while(!q.empty()) {
pair<int, int> p = q.top();
q.pop();
int u = p.second;
if(p.first == INT_MAX) {
break;
}
if(d[u] < p.first) {
continue;
}
for(int i = 0; i < adj[u].size(); i++) {
int v = adj[u][i];
if( parent[v] >= 0 ) continue;
if(fnet[v][u] && d[v] > d[u] + pi[u] - pi[v] - cost[v][u]) {
d[v] = d[u] + pi[u] - pi[v] - cost[v][u];
parent[v] = u;
q.push(make_pair(d[v], v));
}
if(fnet[u][v] < cap[u][v] && d[v] > d[u] + pi[u] - pi[v] + cost[u][v]) {
d[v] = d[u] + pi[u] - pi[v] + cost[u][v];
parent[v] = u;
q.push(make_pair(d[v], v));
}
}
}
for(int i = 0; i < n; i++) {
if(d[i] == INT_MAX)
pi[i] = INT_MAX;
else if(pi[i] != INT_MAX)
pi[i] += d[i];
}
if(parent[t] >= 0)
return 1;
return 0;
}
int mcmf()
{
int flow = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(cap[i][j] || cap[j][i]) {
adj[i].push_back(j);
}
}
}
memset(fnet, 0, sizeof(fnet));
memset(pi, 0, sizeof(pi));
while(dijkstra()) {
int bot = INT_MAX;
int v = t;
while(v != s) {
int u = parent[v];
int m = fnet[v][u]?fnet[v][u]:(cap[u][v] - fnet[u][v]);
if(m < bot)
bot = m;
v = parent[v];
}
v = t;
while(v != s) {
int u = parent[v];
if(fnet[v][u]) {
fnet[v][u] -= bot;
fcost -= bot*cost[v][u];
}else {
fnet[u][v] += bot;
fcost += bot * cost[u][v];
}
v = parent[v];
}
flow += bot;
}
return flow;
}
int main()
{
int t1;
cin>>t1;
memset(fnet, 0, sizeof(fnet));
memset(cap, 0, sizeof(cap));
memset(cost, 0, sizeof(cost));
memset(pi, 0, sizeof(pi));
while(t1--) {
scanf("%d", &n);
int arr[600];
s= 0;
t = 2*n+1;
memset(arr, 0, sizeof(arr));
for(int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
arr[x] += 1;
}
for(int i = 1; i <= n; i++) {
if(arr[i] > 0) {
cost[0][i] = 0;
//cout<<i<<" "<<arr[i]<<"HH"<<endl;
cap[0][i] = arr[i];
adj[0].push_back(i);
adj[i].push_back(0);
}
cost[i+n][2*n+1] = 0;
cap[i+n][2*n+1] = 1;
adj[i+n].push_back(2*n+1);
adj[2*n+1].push_back(i+n);
}
int m;
scanf("%d", &m);
int array1[n+1];
memset(array1, -1, sizeof(array1));
for(int i = 0; i < m ; i++) {
int u;
int v;
scanf("%d", &u);
scanf("%d", &v);
array1[u] = v;
}
for(int i = 1; i <= n; i++) {
if(arr[i] > 0) {
int u = i;
int money = 0;
int zz = u;
while(array1[u] != -1) {
money++;
int v = array1[u];
if(cap[zz][v+n] == 0 && cost[zz][v+n] == 0) {
cap[zz][v+n] = 1;
cost[zz][v+n] = money;
adj[zz].push_back(v+n);
adj[v+n].push_back(zz);
}
u = v;
}
cap[i][i+n] = 1;
cost[i][i+n] = 0;
adj[i].push_back(i+n);
adj[i+n].push_back(i);
}
}
n = 2*n +2;
fcost = 0;
mcmf();
for(int i = 0; i <= n; i++) {
for(int j = 0; j < adj[i].size(); j++) {
int v = adj[i][j];
cap[i][v] = 0;
cost[i][v] = 0;
fnet[i][v] = 0;
cap[v][i] = 0;
cost[v][i] = 0;
fnet[v][i] = 0;
pi[i] = 0;
}
adj[i].clear();
}
printf("%d\n", fcost);
}
return 0;
}