#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
 
using namespace std;
 
#define ll long long
#define pi pair<int,int>
#define pll pair<ll,ll>
#define pii pair<int,pi>
#define X first
#define Y second
#define pb push_back
#define ab(x) ((x)<0?(-(x)):(x))
#define xx(x) ((x)*(x))
#define mp make_pair
#define vi vector<int>
#define vll vector<ll>
#define vs vector<string>
#define vpi vector<pi>
#define vpll vector<pll>
#define ALL(x) (x).begin(),(x).end()
#define Max (1<<25)
#define LLMax (1ll<<60)
template<class T>string ToString(T t){stringstream s;s<<t;return s.str();}
template<class T>void ToOther(T&t,string a){stringstream s(a);s>>t;}


int n,m,T;
int a[55];
int b[55];

int d1[55][55][33];
int t1[55][55][33];

int d2[55][55][66][15];
int t2[55][55][66][15];

int d3[55][55][33];
int t3[55][55][33];

int d4[55][55][66][15];
int t4[55][55][66][15];

int k1[55][55];
int k2[55][55];

int TEST=0;

#define T1 [55][55][33]
#define T2 [55][55][66][15]
#define AALL d1,t1,d2,t2,a
vector< int> vc[44];
vector< vector<int> > v;


int go1(int s,int e,int k,int d1 T1 ,int t1 T1 ,int d2 T2,int t2 T2,int a[55]);
int go2(int s,int e,int p,int r,int d1 T1 ,int t1 T1 ,int d2 T2,int t2 T2,int a[55]){
	if(r==v[p].size() && s>e)return 1;

	if(r==v[p].size())return 0;
	if(s>e)return 0;

	int &R=d2[s][e][p][r];
	int &ck=t2[s][e][p][r];

	if(ck==TEST)return R;
	R=0;ck=TEST;

	if(a[s]==v[p][r] && go2(s+1,e,p,r+1,d1,t1,d2,t2,a) )return R=1;
	for(int i=s;i<=e;i++){
		if( go1(s,i,v[p][r],AALL) && go2(i+1,e,p,r+1,AALL) )return R=1;
	}

	return R;
}

int go1(int s,int e,int k,int d1 T1 ,int t1 T1 ,int d2 T2,int t2 T2,int a[55]){

	int &r=d1[s][e][k];
	int &ck=t1[s][e][k];
	if(ck==TEST)return r;
	r=0;ck=TEST;

	if(s==e){
		if(a[s]==k)return r=1;
		return r=0;
	}

	for(int i=0;i<vc[k].size();i++){
		if( go2(s,e,vc[k][i],0,d1,t1,d2,t2,a) )return r=1;
	}
	return r;
}


void calc(int *a,int Len,int d1 T1 ,int t1 T1 ,int d2 T2,int t2 T2,int k[55][55]){
	for(int L=1;L<=Len;L++){
		for(int s=0;s<=Len+Len-L;s++){
			for(int num=1;num<=30;num++){
				int r=go1(s,s+L-1,num,d1,t1,d2,t2,a);
				if(r)k[s][s+L-1] |= (1<<num);
			}
		}
	}
}

int CK=0;
int D[55][55];
int vis[55][55];
int baseA;
int baseB;

int go(int A,int B){
	if(A==baseA+n && B==baseB+m)return 0;
	if(A==baseA+n)return -Max;
	if(B==baseB+m)return -Max;

	int &r=D[A-baseA][B-baseB];
	int &ck=vis[A-baseA][B-baseB];

	if(ck==CK)return r;
	ck=CK;r=-Max;

	for(int i=A;i<baseA+n;i++)for(int j=B;j<baseB+m;j++)if(k1[A][i] & k2[B][j]){
		r=max(r,go(i+1,j+1)+1);
		if(r==3){
			r=3;
		}
	}return r;
}

int main(){
//freopen("output.txt","w",stdout);
	while(cin>>n>>m>>T,n){
		
		memset(vis,-1,sizeof(vis));
		memset(k1,0,sizeof(k1));
		memset(k2,0,sizeof(k2));

		for(int i=1;i<=30;i++)vc[i].clear();
		v.clear();

		for(int i=0;i<n;i++)scanf("%d",&a[i]),a[i+n]=a[i];
		for(int i=0;i<m;i++)scanf("%d",&b[i]),b[i+m]=b[i];
		
		for(int i=0;i<T;i++){
			vi vv;
			int k;
			int num;scanf("%d",&num);while(num--){
				scanf("%d",&k);vv.pb(k);
			}
			scanf("%d",&k);
			v.pb(vv);
			vc[k].pb(i);
		}
		
		TEST++;calc(a,n,d1,t1,d2,t2,k1);
		TEST++;calc(b,m,d3,t3,d4,t4,k2);

		int r=0;
		for(int i=0;i<n;i++)for(int j=0;j<m;j++){
			baseA=i;
			baseB=j;
			CK++;
			r=max(r,go(i,j));
		}

		if(r==0)r=-1;
		printf("%d\n",r);

	}
}

Measured memory_bytes: 47924