#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<map>
#include<set>
#include<vector>
using namespace std;
const char IN[] = {"pixels.in"};
const char OUT[] = {"pixels.out"};
const int INF = 1000000005;
const double PI = 3.14159265;
const int NMAX = 105 * 105;
#define II inline
#define LL long long
#define PII pair<int, int>
#define PDD pair<double, double>
#define fs first
#define sc second
#define mp make_pair
#define pb push_back
#define FOR(i, a, b) for(int i = a ; i <= b ; i++)
#define IFOR(i, a, b) for(int i = a ; i >= b ; i--)
#define FORIT(it, V) for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)
#define all(a) a, a +
int N;
int REZ;
int S, D;
vector<int> V[NMAX], C[NMAX], F[NMAX];
map<int, int> H[NMAX];
int viz[NMAX], tata[NMAX];
void citi()
{
scanf("%d", &N);
S = 0; D = N*N + 1;
FOR(i, 1, N*N)
{
int x;
scanf("%d", &x);
REZ += x;
V[i].pb(S);V[S].pb(i);
C[i].pb(0);C[S].pb(x);
F[i].pb(0);F[S].pb(0);
H[i][S] = V[i].size() - 1;
H[S][i] = V[S].size() - 1;
}
FOR(i, 1, N*N)
{
int x;
scanf("%d", &x);
REZ += x;
V[i].pb(D);V[D].pb(i);
C[i].pb(x);C[D].pb(0);
F[i].pb(0);F[D].pb(0);
H[i][D] = V[i].size() - 1;
H[D][i] = V[D].size() - 1;
}
FOR(i, 1, N*N)
{
int x, y, z, t;
scanf("%d%d%d%d", &x, &y, &z, &t);
if(i > N)
{
V[i].pb(i - N);V[i - N].pb(i);
C[i].pb(x);C[i - N].pb(x);
F[i].pb(0);F[i - N].pb(0);
H[i][i - N] = V[i].size() - 1;
H[i - N][i] = V[i - N].size() - 1;
}
if(i%N != 1)
{
V[i].pb(i - 1);V[i - 1].pb(i);
C[i].pb(t);C[i - 1].pb(t);
F[i].pb(0);F[i - 1].pb(0);
H[i][i - 1] = V[i].size() - 1;
H[i - 1][i] = V[i - 1].size() - 1;
}
}
}
void write()
{
FOR(i, 0, N*N + 1)
{
FORIT(it, V[i])
printf("%d ", *it);
printf("\n");
}
printf("\n\n");
FOR(i, 0, N*N + 1)
{
FORIT(it, C[i])
printf("%d ", *it);
printf("\n");
}
printf("\n\n");
FOR(i, 0, N*N + 1)
{
FORIT(it, F[i])
printf("%d ", *it);
printf("\n");
}
printf("\n\n");
}
bool bfs()
{
fill(viz, viz + NMAX, 0);
fill(tata, tata + NMAX, 0);
queue<int> Q;
Q.push(S);
viz[S] = 1;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
FOR(i, 0, V[x].size() - 1)
if(!viz[V[x][i]] && F[x][i] < C[x][i])
{
viz[V[x][i]] = 1;
tata[V[x][i]] = x;
if(V[x][i] != D)
Q.push(V[x][i]);
}
}
return viz[D];
}
void flux()
{
while(bfs())
{
FOR(i, 0, V[D].size() - 1)
{
int nod = V[D][i];
tata[D] = nod;
int loc = H[nod][D];
if(!viz[nod] || F[nod][loc] == C[nod][loc]) continue;
int FLUX = INF;
for(nod = D ; nod != S ; nod = tata[nod])
{
loc = H[tata[nod]][nod];
FLUX = min(FLUX, C[tata[nod]][loc] - F[tata[nod]][loc]);
}
for(nod = D ; nod != S ; nod = tata[nod])
{
loc = H[tata[nod]][nod];
F[tata[nod]][loc] += FLUX;
loc = H[nod][tata[nod]];
F[nod][loc] -= FLUX;
}
REZ -= FLUX;
}
}
}
int main()
{
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
citi();
//write();
flux();
printf("%d\n", REZ);
return 0;
}