#include<bits/stdc++.h>
using namespace std;
const int NN=2005;
const long long INF=0x3f3f3f3f3f3f3f3f;
typedef pair<int,int> pa;
struct Node{
long long to,val,fan;
};
vector<Node> ed[NN];
int n,m,s,t;
long long maxflow,ans;
queue<int> q;
int dep[NN],gap[NN],now[NN];
void BFS(){
q.push(t);dep[t]=1;
while(!q.empty()){
int x=q.front();q.pop();
gap[dep[x]]++;
for(Node eg:ed[x]){
int y=eg.to;
if(dep[y]||eg.val)continue;
dep[y]=dep[x]+1;
q.push(y);
}
}
return;
}
long long Dinic(int x,long long flow){
if(x==t)return flow;
long long rest=flow;
for(int &i=now[x];i<ed[x].size();i++){
int y=ed[x][i].to;
if(!ed[x][i].val||dep[y]+1!=dep[x])continue;
long long k=Dinic(y,min((long long)ed[x][i].val,rest));
ed[x][i].val-=k;
ed[y][ed[x][i].fan].val+=k;
rest-=k;
if(!rest)return flow;
}
if(!--gap[dep[x]])dep[s]=t+1;
gap[++dep[x]]++;now[x]--;
return flow-rest;
}
void Add(int u,int v,long long w){
ed[u].push_back({v,w,ed[v].size()});
ed[v].push_back({u,0,ed[u].size()-1});
return;
}
int x[NN],y[NN],w[NN];
unordered_map<int,unordered_map<int,int> > mp;
pa d1[8]={{-1,0},{-1,0},{-1,0},{-1,0},{1,0},{1,0},{1,0},{1,0}},
d2[8]={{0,-1},{0,-1},{0,1},{0,1},{0,-1},{0,-1},{0,1},{0,1}},
d3[8]={{-1,-1},{1,-1},{-1,1},{1,1},{1,-1},{-1,-1},{1,1},{-1,1}};
int main(){
cin>>n;
s=2*n+1,t=s+1;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>w[i];
mp[x[i]][y[i]]=i;
ans+=w[i];
Add(i,i+n,w[i]);
}
for(int i=1;i<=n;i++){
if(x[i]%2||y[i]%2)continue;
for(int j=0;j<8;j++){
int n1=mp[x[i]+d1[j].first][y[i]+d1[j].second],
n2=mp[x[i]+d2[j].first][y[i]+d2[j].second],
n3=mp[x[i]+d3[j].first][y[i]+d3[j].second];
if(n1&&n2&&n3)
Add(s,i,INF),Add(i+n,n1,INF),Add(n1+n,n2,INF),Add(n2+n,n3,INF),Add(n3+n,t,INF);
}
}
BFS();
while(dep[s]<=t){
memset(now,0,sizeof now);
maxflow+=Dinic(s,INF);
}
cout<<ans-maxflow;
return 0;
}