1 #include<iostream>
2 #include<cstring>
3 #include<queue>
4 using namespace std;
5
6 struct data
7 {
8 int to,w,next;
9 }E[6000001];
10 int n,m,node=0,ans;
11 int head[1000001],h[1000001],q[1000001];
12
13 void insert(int u,int v,int w)
14 {
15 node++;
16 E[node].to=v;
17 E[node].w=w;
18 E[node].next=head[u];
19 head[u]=node;
20 }
21
22 bool bfs()
23 {
24 int i;
25 memset(h,-1,sizeof(h));
26 queue<int> Q;
27 Q.push(1);
28 h[1]=0;
29 while(!Q.empty())
30 {
31 int p=Q.front();
32 Q.pop();
33 i=head[p];
34 while(i)
35 {
36 if(E[i].w&&h[E[i].to]<0)
37 {
38 Q.push(E[i].to);
39 h[E[i].to]=h[p]+1;
40 }
41 i=E[i].next;
42 }
43 }
44 if(h[n*m]==-1) return 0;
45 return 1;
46 }
47
48 int dfs(int x,int f)
49 {
50 if(x==n*m) return f;
51 int i=head[x];
52 int w,used=0;
53 while(i)
54 {
55 if(E[i].w&&h[E[i].to]==h[x]+1)
56 {
57 w=f-used;
58 w=dfs(E[i].to,min(w,E[i].w));
59 E[i].w-=w;
60 E[i+1].w+=w;
61 used+=w;
62 if(used==f) return f;
63 }
64 i=E[i].next;
65 }
66 if(!used) h[x]=-1;
67 return used;
68 }
69
70 void dinic()
71 {
72 while(bfs()) ans+=dfs(1,0x7fffffff);
73 }
74
75 int main()
76 {
77 cin>>n>>m;
78 int x;
79 memset(head,0,sizeof(head));
80 for(int i=1;i<=n;i++)
81 for(int j=1;j<m;j++)
82 {
83 cin>>x;
84 insert((i-1)*m+j,(i-1)*m+j+1,x);
85 insert((i-1)*m+j+1,(i-1)*m+j,x);
86 }
87 for(int i=1;i<n;i++)
88 for(int j=1;j<=m;j++)
89 {
90 cin>>x;
91 insert((i-1)*m+j,i*m+j,x);
92 insert(i*m+j,(i-1)*m+j,x);
93 }
94 for(int i=1;i<n;i++)
95 for(int j=1;j<m;j++)
96 {
97 cin>>x;
98 insert((i-1)*m+j,i*m+j+1,x);
99 insert(i*m+j+1,(i-1)*m+j,x);
100 }
101 dinic();
102 cout<<ans;
103 return 0;
104 }