var sx:array[1..400] of integer;
xh,tt:array[1..20,0..20] of integer;
t:array[1..20,0..1000] of boolean;
zt:array[1..20] of longint;
x,y,i,j,k,l,m,n,z,s,f1,f2,f3:longint;
f:boolean;
begin
read(m,n);
for x:=1 to m*n do
read(sx[x]);
for x:=1 to n do
for y:=1 to m do
read(xh[x,y]);
for x:=1 to n do
for y:=1 to m do
read(tt[x,y]);
for x:=1 to m*n do
begin
for y:=1 to m do
if xh[sx[x],y]<>0 then begin
i:=tt[sx[x],y];
j:=xh[sx[x],y];
xh[sx[x],y]:=0;
break;
end;
for f1:=tt[sx[x],y-1] to 1000 do begin
f:=true;
for f2:=f1+1 to f1+i do
if t[j,f2] then f:=false;
if f then
for f3:=f1+1 to f1+i do
t[j,f3]:=true;
if f then tt[sx[x],y]:=f1+i;
if f then break;
end;
end;
for x:=1 to m do begin
for y:=1000 downto 1 do
if t[x,y] then begin
zt[x]:=y;
break;
end;
end;
i:=0;
for x:=1 to m do
if zt[x]>i then i:=zt[x];
write(i);
end.