#include<bits/stdc++.h>
using namespace std;
int n,m,x,mat[505][505],book[505][505],r,l,mid,cnt,maxx,ans,b[4][2]={1,0,0,1,-1,0,0,-1};
struct node{
int x,y;
}f[25005];
void dfs(int x,int y,int D){
book[x][y]=1;
for(int i=0;i<=3;i++){
int nx=x+b[i][0];
int ny=y+b[i][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&abs(mat[x][y]-mat[nx][ny])){
dfs(nx,ny,D);
}
}
}
int check(int D){
memset(book,0,sizeof(book));
dfs(f[1].x,f[1].y,D);
for(int i=1;i<=cnt;i++){
if(book[f[i].x][f[i].y]==0){
return 0;
}
}
return 1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mat[i][j];
maxx=max(maxx,mat[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>x;
if(x==1){
cnt++;
f[cnt].x=i;
f[cnt].y=j;
}
}
}
while(l<=r){
mid=(l+r)/2;
if(check(mid)){
r=mid-1;
ans=mid;
}else{
l=mid+1;
}
}
cout<<ans;
return 0;
}