80 pts
code :
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int maxn = 1e7 + 1550000;
int h1[10000005], h2[10000005], cnt, dep[10000005];
int n, m, s, t;
struct Edge {
int v, last, c, f;
} e[maxn];
void add(int u, int v, int c) {
e[cnt] = {v, h1[u], c, 0};
h1[u] = cnt++;
e[cnt] = {u, h1[v], 0, 0};
h1[v] = cnt++;
}
bool bfs() {
memset(dep, 0, sizeof(dep));
queue<int> q;
q.push(s); dep[s] = 1;
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = h1[u]; ~i; i = e[i].last) {
int v = e[i].v;
if(!dep[v] && e[i].c > e[i].f) {
dep[v] = dep[u]+1, q.push(v);
}
}
}
return dep[t];
}
int dfs(int u, int flow) {
if(u == t || !flow) return flow;
int ret = 0;
for(int &i = h2[u]; ~i; i = e[i].last) {
int v = e[i].v, d;
if(dep[v] == dep[u]+1 && (d = dfs(v, min(flow-ret, e[i].c - e[i].f)))) {
ret += d, e[i].f += d, e[i^1].f -= d;
if(ret == flow) return flow;
}
}
return ret;
}
int MF() {
int ans = 0;
while(bfs()) {
memcpy(h2, h1, sizeof(h2));
ans += dfs(s, 1<<30);
}
return ans;
}
int id(int x, int y) {
return n*x+y;
}
signed main() {
// freopen("P4001.out", "w", stdout);
// freopen("P4001_5.in", "r", stdin);
cin >> n >> m;
memset(h1, -1, sizeof(h1));
s = id(1, 1);
t = id(n, m);
for(int i = 1; i <= n; i++) {
int v;
for(int j = 2; j <= m; j++)
cin >> v, add(id(i, j-1), id(i, j), v), add(id(i, j), id(i, j-1), v);
}
for(int i = 2; i <= n; i++) {
int v;
for(int j = 1; j <= m; j++)
cin >> v, add(id(i-1, j), id(i, j), v), add(id(i, j), id(i-1, j), v);
}
for(int i = 2; i <= n; i++) {
int v;
for(int j = 2; j <= m; j++)
cin >> v, add(id(i-1, j-1), id(i, j), v), add(id(i, j), id(i-1, j-1), v);
}
cout << MF();
return 0;
}