#include<iostream>
using namespace std;
struct pen
{
int jiqi[400];//记录工件的工序的机器号
int time[400];//记录工件的工序的所用时间
int lasttime;//此工件此时末尾的时间
int flag=1;//记录用到那个工序了
}p[10000];
int m,n;
int zhu[10000];
int match[25][400000];//时间轴
int main()
{
cin>>m>>n;
for(int i=1;i<=m*n;i++)cin>>zhu[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>p[i].jiqi[j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>p[i].time[j];
for(int w=1;w<=m*n;w++)//给出的顺序
{
int i=zhu[w];
int matchnow=p[i].jiqi[p[i].flag];//取当前用到的机器号
int timenow=p[i].time[p[i].flag];//当前工序用到的时间
// cout<<i<<" "<<matchnow<<" "<<timenow;
// cout<<endl;
p[i].flag++;
int j=p[i].lasttime+1;//取上一次这一工件的最后的完成时间
while(match[matchnow][j]!=0)//从最后一次完成开始,找到空闲时间
j++;
for(int k=j;k<j+timenow;k++)match[matchnow][k]=i;
p[i].lasttime=j+timenow-1;
}
int maxi=0;
for(int i=1;i<=n;i++)maxi=max(maxi,p[i].lasttime);
cout<<maxi;
return 0;
}