#include<bits/stdc++.h>
using namespace std;
const int N=510;
int a[N][N],di[N][N],n,m;
int dnum=0;
int ne[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
bool vis[N][N];
int d;
struct node{
int x,y;
node(int x1,int y1){
x=x1,y=y1;
}
};
int check(int x)
{
queue<node>q;
q.push(node(1,1));
vis[1][1]=1;
while(q.size())
{
node num=q.front();
q.pop();
if(di[num.x][num.y]==1)d++;
for(int i=0;i<4;i++)
{
int tx=num.x+ne[i][0];
int ty=num.y+ne[i][1];
if(tx>=1&&ty>=1&&tx<=m&&ty<=n&&abs(a[tx][ty]-a[num.x][num.y])<=x)
{
q.push(node(tx,ty));
vis[tx][ty]=1;
if(di[tx][ty]==1)
d++;
}
}
}
return d;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
cin>>di[i][j];
if(di[i][j]==1)
dnum++;
}
int ans=0;
for(int i=1<<30;i;i>>=1)
{
if(check(ans+i)<dnum)ans+=i;
}
cout<<ans+1;
return 0;
}