RT
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int inf = 1e9 + 7;
const int N = 510;
int n, c[N][N], l[N], r[N], vis_l[N], vis_r[N], minn, p[N], ans1, ans2;
int a[N][N];
inline int read () {
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') w = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
bool dfs(int x) {
vis_l[x] = 1;
for(int i = 1; i <= n; i ++ ) {
if(!vis_r[i]) {
int tmp = l[x] + r[i] - c[x][i];
if(!tmp) {
vis_r[i] = 1;
if(!p[i] || dfs(p[i])) {
p[i] = x;
return 1;
}
}
else if(tmp > 0) minn = min(minn, tmp);
}
}
return 0;
}
int km() {
for(int i = 1; i <= n; i ++ ) l[i] = -inf, p[i] = 0;
for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) l[i] = max(l[i], c[i][j]);
for(int i = 1; i <= n; i ++ ) {
memset(vis_l, 0, sizeof(vis_l));
memset(vis_r, 0, sizeof(vis_r));
while(1) {
minn = inf;
if(dfs(i)) break;
for(int j = 1; j <= n; j ++ ) if(vis_l[j]) l[j] -= minn;
for(int j = 1; j <= n; j ++ ) if(vis_r[j]) r[j] += minn;
}
}
}
int main () {
n = read();
for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) c[i][j] = read();
km();
for(int i = 1; i <= n; i ++ ) ans2 += c[p[i]][i];
for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) c[i][j] *= -1;
km();
for(int i = 1; i <= n; i ++ ) ans1 += c[p[i]][i];
printf("%d\n%d\n", -ans1, ans2);
return 0;
}