#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5050;
int m , n , minn;
int a[MAXN] , id[MAXN][MAXN] , times[MAXN][MAXN];
int lft[MAXN] , step[MAXN] , solve[MAXN];
int sum;
bool vis[MAXN] , is_made[MAXN] , flag;
int main()
{
cin >> m >> n;
for(int i = 1 ; i <= m * n ; i++) scanf("%d" , &a[i]);
for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; j++) scanf("%d" , &id[i][j]);
for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; j++) scanf("%d" , ×[i][j]);
do
{
minn = 0x7fffffff;
flag = 0;
for(int i = 1 ; i <= m * n ; i++)
{
if(!vis[i] && !is_made[a[i]] && solve[id[a[i]][step[a[i]] + 1]] == 0)
{
if(solve[id[a[i]][step[a[i]] + 1]] == 0)
{
solve[id[a[i]][step[a[i]] + 1]] = a[i];
vis[i] = 1;
is_made[a[i]] = 1;
lft[id[a[i]][step[a[i]] + 1]] += times[a[i]][step[a[i]] + 1];
}
}
}
for(int i = 1 ; i <= m ; i++)
{
if(lft[i] != 0)
{
flag = 1;
if(minn > lft[i]) minn = lft[i];
}
}
if(flag) sum += minn;
for(int i = 1 ; i <= m ; i++)
{
if(lft[i] != 0)
{
lft[i] -= minn;
if(lft[i] == 0)
{
is_made[solve[i]] = 0;
step[solve[i]]++;
solve[i] = 0;
}
}
}
}
while(flag);
cout << sum;
return 0;
}