#include<bits/stdc++.h>
using namespace std;
const int N=30;
int f[N][N][N];//存储路径所在坐标
int w[N][N];//存数
int n;//与题义同
int main(){
cin>>n;
int a,b,c;
while(cin>>a>>b>>c,a||b||c){
w[a][b]=c;
}//输入
for(int k=2;k<=n+n;k++){//k是两点坐标之和,优化,将四维数组转化为三位数组
for(int i1=1;i1<=n;i1++){//i1是第一条路径坐标
for(int i2=1;i2<=n;i2++){//i2是第二条路径坐标
int j1=k-i1;
int j2=k-i2;//w[i1][i2]为第一次路径坐标数,w[i2][j2]为第二次路径坐标数
if(j1>=1&&j1<=n&&j2>=1&&j2<=n){//判断是否出界
int t=w[i1][j1];
if(i1!=i2){
t+=w[i2][j2];//判断是否在同一个点,如果是就加上这个点数,不是就加上两个点数
}
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2-1]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2]);//dp
}
}
}
}
cout<<f[n+n][n][n];//输出总数
return 0;
}
必将感激不尽