1 #include<bits/stdc++.h>
2 #define MAX 1e9
3 #define NM 1000005
4 using namespace std;
5 int n,m,val,tot,ans,dis;
6 int head[NM],level[NM],q[NM];
7 struct node{
8 int next,to,dis;
9 }E[6*NM];
10 void add(int x,int y,int z){
11 tot++;
12 E[tot].next=head[x];
13 head[x]=tot;
14 E[tot].to=y;
15 E[tot].dis=z;
16 tot++;
17 E[tot].next=head[y];
18 head[y]=tot;
19 E[tot].to=x;
20 E[tot].dis=z;
21 }
22 void pre(){
23 for (int i=1;i<=n;i++)
24 for (int j=1;j<m;j++){
25 scanf("%d",&val);
26 add((i-1)*m+j,(i-1)*m+j+1,val);
27 }
28 for (int i=1;i<n;i++)
29 for (int j=1;j<=m;j++){
30 scanf("%d",&val);
31 add((i-1)*m+j,i*m+j,val);
32 }
33 for (int i=1;i<n;i++)
34 for (int j=1;j<m;j++){
35 scanf("%d",&val);
36 add((i-1)*m+j,i*m+j+1,val);
37 }
38 }
39 bool bfs(){
40 memset(level,0,sizeof(level));
41 level[1]=1;
42 int t=1,w=1;
43 q[1]=1;
44 while (t<=w){
45 int k=q[t];
46 for (int i=head[k];i!=-1;i=E[i].next){
47 int y=E[i].to;
48 if (E[i].dis&&!level[y]){
49 level[y]=level[k]+1;
50 q[++w]=y;
51 }
52 }
53 t++;
54 }
55 return level[n*m]!=0;
56 }
57 int dfs(int s,int maxf){
58 if (s==n*m) return maxf;
59 int ret=0;
60 for (int i=head[s];i!=-1;i=E[i].next){
61 int y=E[i].to;
62 dis=E[i].dis;
63 if (dis&&level[s]+1==level[y]){
64 int Min=min(maxf-ret,dis);
65 dis=dfs(y,Min);
66 E[i].dis-=dis;
67 E[i^1].dis+=dis;
68 ret+=dis;
69 if (ret==maxf) return ret;
70 }
71 }
72 if (!ret) level[s]=0;
73 return ret;
74 }
75 void Dinic(){
76 ans=0;
77 while (bfs()) ans+=dfs(1,MAX);
78 printf("%d\n",ans);
79 }
80 int main(){
81 scanf("%d%d",&n,&m);
82 memset(head,-1,sizeof(head));
83 pre();
84 Dinic();
85 return 0;
86 }