#include<iostream>
#include<cstring>
using namespace std;
typedef struct Work
{
int Time = 0;
int x, y;
}W;
int main()
{
W Working[21];
int m, n;
cin >> m >> n;
int S[450];
int M[30][30];
bool AllRight[30][30] = { false };
for (int i = 0; i < 30; i++)
AllRight[i][0] = true;
memset(M,0,sizeof(M));
int Num = n*m;
int Time[30][30];
for (int i = 1; i <= n*m; i++)
cin >> S[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> M[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> Time[i][j];
int Min = 0;
for (; ;Min++)
{
for (int i = 1; i <= m; i++)
{
if (Working[i].Time)
{
Working[i].Time--;
if (Working[i].Time == 0)
{
AllRight[Working[i].x][Working[i].y] = true;
Num--;
}
}
}
if (Num == 0)
{
break;
}
for (int i = 1; i <= n*m; i++)
{
for (int j = 1; j <= m; j++)
{
if (!AllRight[S[i]][j] && AllRight[S[i]][j - 1])
{
if (!Working[M[S[i]][j]].Time)
{
Working[M[S[i]][j]].Time = Time[S[i]][j];
Working[M[S[i]][j]].x = S[i];
Working[M[S[i]][j]].y = j;
}
}
}
}
}
cout << Min;
return 0;
}