#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1010,maxn=2e5+10,inf=1e18;
int n,s,t,cnt=1,ans,a[N][N],b[N][N],dis[maxn],rad[maxn];
bool in[maxn],vis[maxn];
struct edge
{
int u,v,w,c,nxt;
}e[maxn<<1];
int head[maxn];
inline void add(int x,int y,int z,int c)
{
e[++cnt]=(edge){x,y,z,c,head[x]};
head[x]=cnt;
e[++cnt]=(edge){y,x,0,-c,head[y]};
head[y]=cnt;
}
void init()
{
cin>>n;
s=n+n+1,t=n+n+2;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>b[i][j];
for(int i=1;i<=n;i++)
{
add(s,i,1,0);
add(i+n,t,1,0);
for(int j=1;j<=n;j++)
{
add(i,j+n,1,a[i][j]*b[j][i]);
}
}
}
inline bool spfa()
{
memset(dis,-0x3f,sizeof(dis));
dis[s]=0;
in[s]=1;
queue<int> q;
q.push(s);
while(q.size())
{
int u=q.front();
q.pop();
in[u]=0;
rad[u]=head[u];
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v,c=e[i].c,w=e[i].w;
if(dis[v]>=dis[u]+c || !w) continue;
dis[v]=dis[u]+c;
if(!in[v])
{
in[v]=1;
q.push(v);
}
}
}
return dis[t]!=dis[0];
}
int dfs(int u,int fl)
{
if(u==t)
{
ans+=dis[t]*fl;
return fl;
}
int rest=fl;
vis[u]=1;
for(int i=rad[u];i;i=e[i].nxt)
{
rad[u]=i;
int v=e[i].v;
if(dis[v]!=dis[u]+e[i].c || !e[i].w || vis[v]) continue;
int tmp=dfs(v,min(rest,e[i].w));
e[i].w-=tmp;
e[i^1].w+=tmp;
rest-=tmp;
if(!rest) break;
}
vis[u]=0;
return fl-rest;
}
void dinic()
{
while(spfa()) dfs(s,inf);
cout<<ans;
}
signed main()
{
init();
dinic();
return 0;
}