#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
typedef pair<int,int> PII;
PII p[N*N];
#define x first
#define y second
#define endl "\n"
int high[N][N];
int flag[N][N];
int cnt_flag;
int x1,y_1;
int n,m;
bool st[N][N];
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
bool check(int d)
{
p[0]={x1,y_1};
int cnt=1;
int hh=0;
int tt=0;
while(hh<=tt)
{
auto t = p[hh++];
for(int i=0;i<4;i++)
{
int a=t.x+dx[i];
int b=t.x+dy[i];
if(a<1||a>n||b<1||b>m)
{
continue;
}
if(st[a][b]) continue;
if(abs(high[t.x][t.y]-high[a][b])>d) continue;
p[++tt] = {a,b};
st[a][b]=true;
if(flag[a][b]==1)
{
cnt++;
if(cnt==cnt_flag)
{
return true;
}
}
}
}
return false;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>high[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>flag[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(flag[i][j]==1)
{
cnt_flag++;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(flag[i][j]==1)
{
x1=i;
y_1=j;
break;
}
}
}
int l=-1;
int r=1e9+10;
while(l+1<r)
{
int mid=(l+r)/2;
memset(p,0,sizeof p);
memset(st,false,sizeof st);
if(check(mid))
{
r=mid;
}
else
{
l=mid;
}
}
cout<<r<<endl;
return 0;
}