#include<bits/stdc++.h>
using namespace std;
const int N= 505;
int n,m,sx=0,sy=0;
int high[N][N];
int flag[N][N];
bool st[N][N];
int flag_cnt = 0;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
typedef pair<int,int> PII;
PII q[N*N];
bool check(int mid){
q[0] = {sx,sy};
st[sx][sy] = true;
int hh =0,tt=0,cnt = 1;
while(hh<=tt){
auto t = q[hh++];
for(int i =0;i<4;i++){
int a = t.first +dx[i],b = t.second+dy[i];
if(a<1||b<1||a>n||b>m) continue;
if(st[a][b]) continue;
if(abs(high[a][b] - high[t.first][t.second]) > mid) continue;
st[a][b] = true;
q[++tt] = {a,b};
if(flag[a][b] == 1){
cnt++;
if(cnt==flag_cnt)
return true;
}
}
}
return false;
}
int main(){
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j ++){
scanf("%d",&high[i][j]);
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
scanf("%d",&flag[i][j]);
if(flag[i][j] == 1){
flag_cnt ++;
}
}
}
for(int i = 1;i <=n;i++){
for(int j=1;j<=m;j++){
if(flag[i][j] == 1){
sx = i;
sy = j;
}
break;
}
}
int l =-1,r=1e9+1;
while(l+1 <r ){
int mid = (l+r)/2;
memset(st,false,sizeof(st));
memset(q,0,sizeof(q));
if(check(mid))
r = mid;
else
l = mid;
}
printf("%d\n",r);
return 0;
}