#include<bits/stdc++.h>
using namespace std;
struct mech{
int id;
int time;
};
mech me[22][22];
int l[30][10000],r[30][10000],stime[30][30],mid[30],ans=0;
int wan[30]={},shunxu[500],m,n;
int main(){
cin>>m>>n;
for(int i=1;i<=m*n;++i){
cin>>shunxu[i];
}
for(int i=1;i<=m;++i){
mid[i]=1;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>me[i][j].id;
r[i][j]=10000;
l[i][j]=0;
stime[i][j]=0;
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>me[i][j].time;
}
}
for(int k=1;k<=m*n;++k){
int line=shunxu[k];
int nowp=wan[line]+1;
int nowjq=me[line][nowp].id;
for(int i=1;i<=mid[nowjq];++i){
if(l[nowjq][i]<stime[line][nowp]&&stime[line][nowp]+me[line][nowp].time<=r[nowjq][i]){
mid[nowjq]++;
for(int j=mid[nowjq];j>i+1;--j){
l[nowjq][j]=l[nowjq][j-1];
r[nowjq][j]=r[nowjq][j-1];
}
l[nowjq][i+1]=stime[line][nowp]+me[line][nowp].time;
r[nowjq][i+1]=r[nowjq][i];
r[nowjq][i]=stime[line][nowp];
stime[line][nowp+1]=stime[line][nowp]+me[line][nowp].time;
break;
}else if(stime[line][nowp]<=l[nowjq][i]&&l[nowjq][i]+me[line][nowp].time<=r[nowjq][i]){
stime[line][nowp+1]=l[nowjq][i]+me[line][nowp].time;
l[nowjq][i]+=me[line][nowp].time;
break;
}
}
wan[line]++;
}
for(int i=1;i<=m;++i){
ans=max(ans,l[i][mid[i]]);
}
cout<<ans;
}