#include <iostream>
#include <algorithm>
using namespace std;
const int N(25);
struct item{
	int w[N];
	int t[N];
	int now;
	int s;
};
int order[N*N]={0};
item data[N];
bool mach[N][N*N]={false};
int main()
{
	for(int i=0;i<N;i++)
	{
		fill(data[i].w,data[i].w+N,0);
		fill(data[i].t,data[i].w+N,0);
	}
	int m,n,ans(0);
	cin>>m>>n;
	for(int i=1;i<=m*n;i++)
		cin>>order[i];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>data[i].w[j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>data[i].t[j];
	for(int i=1;i<=n;i++)
		data[i].now=1,data[i].s=1;
	for(int i=1;i<=m*n;i++)
	{
		int x(order[i]),no(data[x].now),
		ma(data[x].w[no]),t(data[x].t[no]),p(data[x].s);
		bool find=false;
		while(!find)
		{
			if(mach[ma][p]==false)
			{
				int j;
				for(j=0;j<t;j++)
					if(mach[ma][p+j])
						break;
				if(j==t)
				{
					for(j=0;j<t;j++)
						mach[ma][p+j]=true;
					data[x].now++;
					data[x].s=p+j;
					ans=max(ans,p+j-1);
					find=true;
				}
				else
					p=p+j;
			}
			else
				p++;
		}
	}
	cout<<ans<<endl;
	return 0;
}
/**************************************************************
	Problem: 2266
	User: admin
	Language: C++
	Result: Accepted
	Time:62 ms
	Memory:2096 kb
****************************************************************/