#include <bits/stdc++.h>
using namespace std;
ifstream fi("pixels.in");
ofstream fo("pixels.out");
using i64 = long long;
const int L = 105, N = L * L * 2, C = 200;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
struct Edge {
int u, v, cap, flow; };
vector<int> g[N];
int far[N], f[N], a[L][L], b[L][L];
vector<Edge> edges;
int n, ant, src, snk;
static void make_edg(int u, int v, int cap) {
g[u].push_back(edges.size()); edges.push_back({u, v, cap, 0});
g[v].push_back(edges.size()); edges.push_back({v, u, cap, 0}); }
static bool pump(int src, int snk) {
static int tid = 0; ++tid;
static deque<int> dq;
int u, cap;
dq.push_back(src);
f[src] = tid;
while (!dq.empty()) {
u = dq.front();
dq.pop_front();
for (auto v: g[u]) if (edges[v].cap - edges[v].flow > 0 && f[edges[v].v] != tid) {
dq.push_back(edges[v].v);
far[edges[v].v] = v;
f[edges[v].v] = tid; } }
if (f[snk] == tid)
for (auto v: g[snk]) if (f[edges[v^= 1].u] == tid) {
u = edges[v].u;
cap = edges[v].cap - edges[v].flow;
while (u != src && cap > 0) {
cap = min(cap, edges[far[u]].cap - edges[far[u]].flow);
u = edges[far[u]].u; }
ant-= cap;
if (!cap)
continue;
u = edges[v].u;
edges[v].flow+= cap;
edges[v ^ 1].flow-= cap;
while (u != src) {
edges[far[u]].flow+= cap;
edges[far[u] ^ 1].flow-= cap;
u = edges[far[u]].u; } }
return f[snk] == tid; }
static bool ok(int x, int y) {
return (1 <= x && x <= n) && (1 <= y && y <= n); }
static int cod(int x, int y) {
--x, --y;
return x * n + y; }
int main() {
int nx, ny, t;
fi >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
fi >> a[i][j],
ant+= a[i][j];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
fi >> b[i][j],
ant+= b[i][j];
src = 2 * n * n + 2;
snk = 2 * n * n + 3;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
make_edg(2 * cod(i, j), 2 * cod(i, j) + 1, 1e9);
for (int d = 0; d < 4; ++d) {
fi >> t;
nx = i + dx[d];
ny = j + dy[d];
if (ok(nx, ny) && (i + j) % 2 == 1) {
make_edg(2 * cod(i, j) + 1, 2 * cod(nx, ny) + 1, 0);
make_edg(2 * cod(i, j), 2 * cod(nx, ny), 0);
make_edg(2 * cod(i, j), 2 * cod(nx, ny) + 1, t); } } }
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
make_edg(src, 2 * cod(i, j), a[i][j]);
make_edg(snk, 2 * cod(i, j) + 1, b[i][j]); }
while (pump(src, snk));
fo << ant << endl;
return 0; }