#include<bits/stdc++.h>
using namespace std;
const int N=512;
#define ll long long
#define pii pair<int,int>
int m,n;
int h[N][N];
bool lub[N][N];
ll ans;
queue<pii>Q;
int dx[4]={0,-1,0,1},dy[4]={1,0,-1,0};
bool vis[N][N];
int cnt,lcnt;
int sx,sy;
bool bfs(int k){
while(!Q.empty()){
Q.pop();
}
Q.push({sx,sy});
while(!Q.empty()){
int x=Q.front().first,y=Q.front().second; Q.pop();
for(int i=0;i<4;i++){
int px=x+dx[i],py=y+dy[i];
if(px>m||py>n||px<1||py<1||vis[px][py]){
continue;
}
if(abs(h[px][py]-h[x][y])<=k){
Q.push({px,py});
vis[px][py]=1;
if(lub[px][py]){
cnt++;
}
}
}
}
return lcnt==cnt;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>h[i][j];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>lub[i][j];
if(lub[i][j]){
sx=i,sy=j;
lcnt++;
}
}
}
ll l=0,r=1e12,ans;
while(l<=r){
ll mid=(l+r)>>1;
memset(vis,0,sizeof vis); cnt=0;
if(bfs(mid)){
ans=mid,r=mid-1;
}
else{
l=mid+1;
}
}
cout<<ans;
return 0;
}