#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,fa[1000000],a[1000000],dge[1000000];
bool f[1000000];
ll find(ll x){
if(fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
void he(ll x,ll y){
if(dge[x]<=dge[y]) fa[x]=y;
else fa[y]=x;
if(dge[x]==dge[y] && x!=y) dge[y]++;
}
bool cheak(ll x){
memset(dge,0,sizeof(dge));
memset(fa,0,sizeof(fa));
for(ll i=1;i<=n*m;i++) fa[i]=i;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(i+1<=n && abs(a[i*m+j]-a[i*m-m+j])<=x){
he(find(i*m+j),find(i*m-m+j));
}
if(j+1<=m && abs(a[i*m-m+j+1]-a[i*m-m+j])<=x){
he(find(i*m-m+j+1),find(i*m-m+j));
}
}
}
bool flag=false;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(f[i*m+j-m]){
if(!flag){
flag=true;
x=find(i*m-m+j);
}
if(find(i*m-m+j)!=x) return false;
}
}
}
return true;
}
int main(){
cin>>n>>m;
ll ans=0,l=0,r=0;
for(ll i=1;i<=n;i++) for(ll j=1;j<=m;j++){
cin>>a[i*m-m+j];
r=max(r,a[i*m-m+j]);
}
ll mid=(l+r)/2;
for(ll i=1;i<=n;i++) for(ll j=1;j<=m;j++) cin>>f[i*m-m+j];
while(l<=r){
mid=(l+r)/2;
if(cheak(mid)){
r=mid-1;
ans=r;
}else{
l=mid+1;
}
}
cout<<ans;
return 0;
}