#include <cstdio>
#include <iostream>
#include <string>
#include <map>

using namespace std;

//“每一步走尽量远”的贪心思路是没错的,虚心学习他人做法,汲取那个“标记”的思路。
//每次切走时有一个关键细节,详见该处注释 

map<string, bool> agent;

int main(){
	int n,m;
	while(scanf("%d",&n) != EOF){
		string s;
		for(int i=0; i<n; i++){
			cin >> s;
			agent.insert(pair<string, bool>(s, false));
		}
		int cnt = 0;//当前agent中已被标记的个数 
		int ans = 0;//切换次数 
		scanf("%d",&m);
		int bk = 0;//里层break标识 
		for(int i=0; i<m; i++){
			cin >> s;
			if(agent.count(s)){//有对应的代理
				if(n == 1){//无解情况的处理 
					printf("-1\n");
					bk = 1;
					i++;
					while(i<m){
						cin>>s; i++;
					}
					break;
				}
				if(agent[s] == false){//没标记过则标记 
					cnt++;
					agent[s] =  true;
				}
			}
			if(cnt == n){//已全都标记过,则执行切换 切换的目标待定 (刚才这一轮应该用哪个来扫,也是此时才确定的) 
						//注意一个关键细节:由于是“切走”,所以切之前的那个直接置为true 
				cnt = 1;
				ans++;
				for(map<string,bool>::iterator iter = agent.begin(); iter!=agent.end(); iter++){//学习使用迭代器 
					if(iter->first != s){
						iter->second = false;//全部重置为未标记状态 
					}
				}
			}
		}
		if(bk){
			continue;
			agent.clear();
		}
		printf("%d\n",ans);
		agent.clear();
	}
	return 0;
}