#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define MIN(a,b) ((a)<(b)?(a):(b))
#define V 250010
#define E (6*V)
#define INF 0x3fffffff
int n,m,e;
int first[V],next[E],v[E],cap[E],flow[E];
int prev[V],pree[V];
void init()
{
e=0;
memset(first,-1,sizeof(int)*(n*m+1));
memset(flow,0,sizeof(int)*(n*m+1)*6);
}
void insert(int a,int b,int c)
{
v[e]=b;
cap[e]=c;
next[e]=first[a];
first[a]=e++;
}
void EK(int s,int t)
{
int maxflow=0;
int i,a,b;
while(true)
{
queue<int> q;
memset(pree,-1,sizeof(int)*(n*m+1));
memset(prev,-1,sizeof(int)*(n*m+1));
q.push(s);
while(!q.empty())
{
a=q.front(),q.pop();
if(a==t) break;
for(i=first[a];i!=-1;i=next[i])
{
b=v[i];
if(prev[b]==-1 && cap[i]>flow[i])
{
prev[b]=a;
pree[b]=i;
q.push(b);
}
}
}
if(prev[t]==-1) break;
int aug=INF;
for(b=t,a=prev[b]; b!=s; b=a,a=prev[a])
{
int i=pree[b];
aug=MIN(aug,cap[i]-flow[i]);
}
for(b=t,a=prev[b];b!=s;b=a,a=prev[a])
{
int i=pree[b];
flow[i]+=aug;
}
maxflow+=aug;
}
printf("%d\n",maxflow);
}
int main()
{
int i,j,k;
int a,b;
while(~scanf("%d%d",&n,&m))
{
init();
for(i=0;i<n;i++)
{
for(j=0;j<m-1;j++)
{
scanf("%d",&k);
a=i*m+j;
b=a+1;
insert(a,b,k);
insert(b,a,k);
}
}
for(i=0;i<n-1;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&k);
a=i*m+j;
b=a+m;
insert(a,b,k);
insert(b,a,k);
}
}
for(i=0;i<n-1;i++)
{
for(j=0;j<m-1;j++)
{
scanf("%d",&k);
a=i*m+j;
b=a+m+1;
insert(a,b,k);
insert(b,a,k);
}
}
EK(0,n*m-1);
}
return 0;
}