#include<bits/stdc++.h>
using namespace std;
const int maxn = 510*510;
const int maxm = maxn*4;
int fa[maxn], tot;
struct Edge{
int from, to,value;
bool operator < (const Edge b)const {
return value < b.value;
}
}edge[maxm];
void init(int n){
for(int i=1; i<=n; i++){
fa[i]=i;
}
}
int find(int x){
if(x != fa[x]){
fa[x]=find(fa[x]);
}
return fa[x];
}
int num[maxn];
int arr[maxn];
int main(){
int m, n;
cin >> m >> n;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++)
{
cin >> arr[i*n+j];
}
}
int sum =0;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++)
{
cin >> num[i*n+j];
if(num[i*n+j] == 1){
sum++;
}
}
}
if(sum <= 1){
cout << 0;
return 0;
}
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++)
{
if(i-1>0){
edge[++tot].to=(i-1)*n+j;
edge[tot].from=i*n+j;
edge[tot].value = abs(arr[i*n+j]-arr[(i-1)*n+j]);
}
if(j-1>0){
edge[++tot].to=i*n+j-1;
edge[tot].from=i*n+j;
edge[tot].value = abs(arr[i*n+j]-arr[i*n+j-1]);
}
if(i+1<=m){
edge[++tot].to=(i+1)*n+j;
edge[tot].from=i*n+j;
edge[tot].value = abs(arr[i*n+j]-arr[(i+1)*n+j]);
}
if(j+1<=n){
edge[++tot].to=i*n+j+1;
edge[tot].from=i*n+j;
edge[tot].value = abs(arr[i*n+j]-arr[i*n+j+1]);
}
}
}
sort(edge+1, edge+1+tot);
init(maxn);
for(int i=1; i<=tot; i++){
int u = find(edge[i].from);
int v = find(edge[i].to);
if(u != v){
fa[u]=v;
num[v]+=num[u];
if(num[v] == sum){
cout << edge[i].value <<endl;
return 0;
}
}
}
return 0;
}