rt
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 15;
int n;
int a[N][N], f[N][N][N][N];
int dfs(int x, int y, int x1, int y1) {
if (f[x][y][x1][y1] != -1) {
return f[x][y][x1][y1];
}
if (x == n && y == n && x1 == n && y1 == n) {
return 0;
}
int now = 0;
if (x < n && x1 < n) {
int cnt = dfs(x + 1, y, x1 + 1, y1);
if (x == x1 && y == y1) {
now = max(now, a[x + 1][y] + cnt);
}else {
now = max(now, a[x + 1][y] + a[x1 + 1][y] + cnt);
}
}
if (y < n && x1 < n) {
int cnt = dfs(x, y + 1, x1 + 1, y1);
if ((x == x1 + 1) && (y + 1 == y1)) {
now = max(now, a[x][y + 1] + cnt);
}else {
now = max(now, a[x][y + 1] + a[x1 + 1][y1] + cnt);
}
}
if (y < n && y1 < n) {
int cnt = dfs(x, y + 1, x1, y1 + 1);
if ((x == x1) && (y == y1)) {
now = max(now, a[x][y + 1] + cnt);
}else {
now = max(now, a[x][y + 1] + a[x1][y1 + 1] + cnt);
}
}
if (x < n && y1 < n) {
int cnt = dfs(x + 1, y, x1, y1 + 1);
if ((x + 1 == x1) && (y == y1 + 1)) {
now = max(now, a[x + 1][y] + cnt);
} else {
now = max(now, a[x + 1][y] + a[x1][y1 + 1] + cnt);
}
}
f[x][y][x1][y1] = now;
return now;
/* if (y < n && x1 < n) {
int cnt = dfs(x, y + 1, x1 + 1, y1);
if ((x == x1 + 1) && (y + 1 == y1)) {
now = max(now, a[x][y + 1] + cnt);
}else {
now = max(now, a[x][y + 1] + a[x1 + 1][y] + cnt);
}
} */
}
int main() {
memset(f, -1, sizeof f);
cin >> n;
while (1) {
int x, b, c;
cin >> x >> b >> c;
if (x == 0 && b == 0 && c == 0) break;
a[x][b] = c;
}
cout << dfs(1, 1, 1, 1) + a[1][1] << endl;
return 0;
}