#include<bits/stdc++.h>
using namespace std;
int a[500],b[30][30],c[30][30],gx[30];
//a用于存储元件处理的系列,
int lasttime[100000];
bool timeline[2500][2500];
bool check(int x,int y,int id){
for(int i=x;i<=y;i++)
if (timeline[id][i])
return false;
return true;
}
int main() {
int m,n,idnum,timenum,nown;
cin>>m>>n;
for(int i=1;i<=m*n;i++)
cin>>a[i]; //读取加工顺序
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>b[i][j]; //读取相应工序需要使用的机器号
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>c[i][j]; //读取每个工序需要使用机器的时间
for(int i=1;i<=m*n;i++){
nown=a[i]; //当前需要进入排序的元件编号
gx[nown]++; //当前进行处理的元件需要使用的机器序号
idnum=b[nown][gx[nown]]; //找到当前处理的元件需要使用的加工机器的序号
timenum=c[nown][gx[nown]]; //获得那个元件,第几道工序,需要使用那个机器
//需要多少时间
//需要对时间轴进行扫描
//cout<<i<<" *** "<<nown<<" "<<gx[nown]<<" "<<idnum<<" "<<timenum<<endl;
for(int t=lasttime[nown]+1;;t++) //开始的位置应当是当前原件已经使用掉的时间,而不是时间轴使用到的时间
//时间轴使用的时间通过布尔型数组去记录,而原件使用的时间通过lasttime 去记录
if(check(t,t+timenum-1,idnum)){
for(int tt=t;tt<=t+timenum-1;tt++)
timeline[idnum][tt]=true;
lasttime[nown]=t+timenum-1;
break;
}
//cout<<i<<" : "<<nown<<" "<<gx[nown]<<" "<<idnum<<" "<<timenum<<" "<<lasttime[nown]<<endl;
}
int maxn=0;
for(int i=1;i<=n;i++) //cout<<lasttime[i]<<" "; 从n个原件当中去找到最大值
if(maxn<lasttime[i]) maxn=lasttime[i];
cout<<maxn;
return 0;
}