#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
const int N=15;
// 读取矩阵数值
int R;
scanf("%d", &R);
int matrix[N][N];
memset(matrix, 0x00, sizeof matrix);
int i, j, v;
while(scanf("%d%d%d", &i, &j, &v)==3, i||j||v){
matrix[i][j]=v;
}
// 同时存储两条路径, 令k=x+y表示当前位置的坐标和, 对k进行枚举
int f[2*N][N][N];
memset(f, 0x00, sizeof f);
for(int k=2; k<=2*R; ++k){
for(int x1=1; x1<=R; ++x1){
for(int x2=1; x2<=R; ++x2){
int y1=k-x1, y2=k-x2;
if(y1>=1 && y1<=R && y2>=1 && y2<=R){
int val = matrix[x1][y1];
// 如果不是经过同一个格子, 那么需要计算两次矩阵数值
if(x1 != x2) val += matrix[x2][y2];
// 枚举四种可能的路径
// 1. 路径1由上方过来, 路径2由左边过来
f[k][x1][x2] = max(f[k][x1][x2], f[k-1][x1-1][x2]+val);
// 2.路径1由上方过来, 路径2由上方过来
f[k][x1][x2] = max(f[k][x1][x2], f[k-1][x1-1][x2-1]+val);
// 3.路径1由左方过来, 路径2由上方过来
f[k][x1][x2] = max(f[k][x1][x2], f[k-1][x1][x2-1]+val);
// 4.路径1由左方过来, 路径2由左方过来
f[k][x1][x2] = max(f[k][x1][x2], f[k-1][x1][x2]+val);
}
}
}
}
printf("%d\n", f[2*R][R][R]);
return 0;
}