#include<bits/stdc++.h>
#define INF 2147483647
#define N 900000
using namespace std;
struct MF {
struct edge {
int ed,nxt,cap,flow;
} e[N<<6];
int head[N],cnt=0;
int n,S=1,T;
long long maxflow=0;
int dep[N],cur[N];
inline void init() {
memset(head,-1,sizeof head);
cnt=0;
}
inline void addedge(int u,int v,int w) {
e[cnt]= {v,head[u],w,0};
head[u]=cnt++;
e[cnt]= {u,head[v],w,0};
head[v]=cnt++;
}
inline bool bfs() {
queue<int> q;
memset(dep,0,sizeof(int)*(n+1));
dep[S]=1;
q.push(S);
while(q.size()) {
int u=q.front();
q.pop();
for(int i=head[u]; ~i; i=e[i].nxt) {
int v=e[i].ed;
if((!dep[v])&&(e[i].cap>e[i].flow)) {
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[T];
}
inline int dfs(int u,int flow) {
if((u==T)||(!flow)) return flow;
int ret=0;
for(int& i=cur[u]; ~i; i=e[i].nxt) {
int v=e[i].ed,d;
if((dep[v]==dep[u]+1)&&(d=dfs(v,min(flow-ret,e[i].cap-e[i].flow)))) {
ret+=d;
e[i].flow+=d;
e[i^1].flow-=d;
if(ret==flow) return ret;
}
}
return ret;
}
inline void dinic() {
while(bfs()) {
memcpy(cur,head,sizeof(int)*(n+1));
maxflow+=dfs(S,INF);
}
}
} mf;
int n,m;
inline void initt() {
mf.init();
scanf("%d%d",&n,&m);
mf.T=n*m;
mf.n=n*m+2;
for(int i=1; i<=n; ++i) {
int u=(i-1)*m;
for(int j=1; j<m; ++j) {
int x;
++u;
scanf("%d",&x);
mf.addedge(u,u+1,x);
}
}
for(int i=1; i<n; ++i) {
int u=(i-1)*m;
for(int j=1; j<=m; ++j) {
int x;
++u;
scanf("%d",&x);
mf.addedge(u,u+m,x);
}
}
for(int i=1; i<n; ++i) {
int u=(i-1)*m;
for(int j=1; j<m; ++j) {
int x;
++u;
scanf("%d",&x);
mf.addedge(u,u+m+1,x);
}
}
}
signed main() {
initt();
mf.dinic();
printf("%lld",mf.maxflow);
return 0;
}