#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define N 10005
#define M 105
using namespace std;
int n,m,m1,n1,sum,zs[20*N],f[20*N],fs[N],dat[N],nt[20*N],dt[20*N],h[N],a[M][M],b[M][M],c[M][M],d[M][M],w[M][M],l[M][M],s1[M][M],s2[M][M],fx[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
void link(int x,int y,int p)
{
nt[++m1]=fs[x];
fs[x]=m1;
dt[m1]=y;
f[m1]=p;
}
void make(int x,int y,int v1,int v2)
{
link(x,y,v1);
link(y,x,v2);
zs[m1]=m1-1;
zs[m1-1]=m1;
}
bool bfs()
{
memset(h,0,sizeof(h));
h[1]=dat[1]=1;
int i=0,j=1,k,p;
while(i++<j)
{
for(k=fs[dat[i]];k;k=nt[k])
{
p=dt[k];
if (f[k]>0&&h[p]==0) h[p]=h[dat[i]]+1,dat[++j]=p;
}
}
return h[n1]>0;
}
int dinic(int k,int s)
{
if (k==n1) return s;
int i,p,l,sl=0;
for(i=fs[k];i;i=nt[i])
{
p=dt[i];
if (f[i]>0&&h[p]==h[k]+1)
{
l=dinic(p,min(s,f[i]));
if (l>0)
{
f[i]-=l;
f[zs[i]]+=l;
s-=l;
sl+=l;
if (s==0) break;
}
}
}
if (sl==0) h[k]=-1;
return sl;
}
int main()
{
cin>>n>>m;
sum=0;
n1=n*m+2;
m1=0;
int p,i,j,k;
fo(i,1,n) fo(j,1,m) scanf("%d",&a[i][j]),sum+=a[i][j];
fo(i,1,n) fo(j,1,m) scanf("%d",&b[i][j]),sum+=b[i][j];
fo(i,1,n-1) fo(j,1,m) scanf("%d",&c[i][j]),sum+=c[i][j],s1[i][j]+=c[i][j],s1[i+1][j]+=c[i][j];
fo(i,1,n-1) fo(j,1,m) scanf("%d",&d[i][j]),sum+=d[i][j],s2[i][j]+=d[i][j],s2[i+1][j]+=d[i][j];
fo(i,1,n) fo(j,1,m-1) scanf("%d",&w[i][j]),sum+=w[i][j],s1[i][j]+=w[i][j],s1[i][j+1]+=w[i][j];
fo(i,1,n) fo(j,1,m-1) scanf("%d",&l[i][j]),sum+=l[i][j],s2[i][j]+=l[i][j],s2[i][j+1]+=l[i][j];
fo(i,1,n)
{
fo(j,1,m)
{
int v=(i-1)*m+j+1;
make(1,v,2*a[i][j]+s1[i][j],0);
make(v,n1,2*b[i][j]+s2[i][j],0);
fo(k,0,3)
{
int x=i+fx[k][0],y=j+fx[k][1];
int v1=(x-1)*m+y+1;
if (x>0&&y>0&&x<=n&&y<=m&&v1>v)
{
int g;
if(k==0) g=c[i][j]+d[i][j];
if(k==1) g=w[i][j]+l[i][j];
if(k==2) g=w[x][y]+l[x][y];
if(k==3) g=c[x][y]+d[x][y];
make(v,v1,g,g);
}
}
}
}
int ans=0;
while(bfs()) ans+=dinic(1,200000000);
cout<<sum-ans/2;
}