1 #include<cstdio>
2 #include<cstring>
3 #include<cmath>
4 #include<iostream>
5 using namespace std;
6 const int inf=100000000,N=1010000;
7 struct ee{int to,next,f;}e[12000010];
8 int head[N],q[N*2],dis[N];
9 int S,T,n,m,cnt=1,ans,w;
10
11 void ins(int u,int v,int f){
12 e[++cnt].to=v;e[cnt].f=f;e[cnt].next=head[u];head[u]=cnt;
13 e[++cnt].to=u;e[cnt].f=0;e[cnt].next=head[v];head[v]=cnt;
14 }
15
16 bool bfs(){
17 for (int i=1;i<=T;i++) dis[i]=inf;
18 int h=0,t=1,now;
19 q[1]=S;dis[S]=0;
20 while(h!=t){
21 now=q[++h];
22 for (int i=head[now];i;i=e[i].next){
23 int v=e[i].to;
24 if (e[i].f&&dis[now]+1<dis[v]){
25 dis[v]=dis[now]+1;
26 if (v==T)return 1;
27 q[++t]=v;
28 }
29 }
30 }
31 if (dis[T]==inf) return 0; return 1;
32 }
33
34 int dinic(int now,int f){
35 if (now==T) return f;
36 int rest=f;
37 for (int i=head[now];i;i=e[i].next){
38 int v=e[i].to;
39 if (e[i].f&&dis[v]==dis[now]+1&&rest){
40 int t=dinic(v,min(rest,e[i].f));
41 if (!t) dis[v]=0;
42 e[i].f-=t;
43 e[i^1].f+=t;
44 rest-=t;
45 //if(t) printf("%d %d %d\n",now,v,e[i].f);
46 }
47 }
48 return f-rest;
49 }
50 int main(){
51 scanf("%d%d",&n,&m);
52 S=0,T=n*m+1;
53 ins(S,1,inf);ins(n*m,T,inf);
54 for (int i=1;i<=n;i++)
55 for (int j=1;j<=m-1;j++){
56 scanf("%d",&w);
57 int u=(i-1)*m+j;
58 ins(u,u+1,w);
59 ins(u+1,u,w);
60 }
61 for (int i=1;i<=n-1;i++)
62 for (int j=1;j<=m;j++){
63 scanf("%d",&w);
64 int u=(i-1)*m+j;
65 ins(u,u+m,w);
66 ins(u+m,u,w);
67 }
68 for (int i=1;i<=n-1;i++)
69 for(int j=1;j<=m-1;j++){
70 scanf("%d",&w);
71 int u=(i-1)*m+j;
72 ins(u,u+m+1,w);
73 ins(u+m+1,u,w);
74 }
75 while (bfs())
76 ans+=dinic(S,inf);
77 printf("%d",ans);
78 return 0;
79 }
80