/*
* File: pku1087.cpp
* Author: chenjiang
*终于过了这题,好难建图啊。
* Created on 2010年4月18日, 下午4:02
*/
#include <stdlib.h>
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <stdio.h>
using namespace std;
#define _max 600
int mapmap[_max][_max], my[_max], n, m, k, num, link[_max][_max];
int next[_max];
bool visited[_max];
map<string, int>My;
string str, str1, str2;
int left0, right0;
bool find(int x) {
for (int i = 1; i <= right0; i++) {
if (!visited[i] && mapmap[x][i]) {
visited[i] = 1;
if (my[i] == -1 || find(my[i])) {
my[i] = x;
return 1;
}
}
}
return 0;
}
int MMG() {
int ans = 0;
memset(my, -1, sizeof (my));
for (int i = 1; i <= left0; i++) {
memset(visited, 0, sizeof (visited));
if (find(i)) {
ans++;
}
}
return ans;
}
/*
*
*/
int main(int argc, char** argv) {
//freopen("a.a", "r", stdin);
int t;
while (cin >> n) {
My.clear();
num = 0;
for (int i = 1; i <= n; i++) {
cin >> str;
My[str] = ++num;
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> str1 >> str2;
if (!My[str2]) {
My[str2] = ++num;
}
next[i] = My[str2];
}
cin >> k;
memset(link, 0, sizeof (link));
for (int i = 1; i <= k; i++) {
cin >> str1 >> str2;
if (!My[str2]) {
My[str2] = ++num;
}
if (!My[str1]) {
My[str1] = ++num;
}
link[My[str1]][My[str2]] = 1;
}
for (int i = 1; i <= num; i++) {
link[i][i] = 1;
}
for (k = 1; k <= num; k++) {
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= num; j++) {
link[i][j] = link[i][j] || (link[i][k] && link[k][j]);
}
}
}
left0 = m;
right0 = n;
memset(mapmap, 0, sizeof (mapmap));
for (int i = 1; i <= m; i++) {
k = next[i];
for (int j = 1; j <= n; j++) {
if (link[k][j])
mapmap[i][j] = 1;
}
}
int ans = MMG();
cout << m - ans << endl;
}
return (EXIT_SUCCESS);
}