#include<bits/stdc++.h>
const int inf=2e9;
using namespace std;
int n,x[1010],y[1010],ty[1010],ru[1010],chu[1010],cnt=0,S=++cnt,T=++cnt,head[2010],o=1,cur[2010],dep[2010];
long long ans=0;
struct edge{
	int to,link,w;
}e[20010];
void add_edge(int u,int v,int w){
	e[++o].to=v,e[o].link=head[u],head[u]=o,e[o].w=w;
	e[++o].to=u,e[o].link=head[v],head[v]=o,e[o].w=0;
}
queue<int>q;
bool bfs(){
	for(int i=1;i<=cnt;i++) dep[i]=0,cur[i]=head[i];
	dep[S]=1,q.push(S);
	while(q.size()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=e[i].link) if(e[i].w&&!dep[e[i].to]){
			dep[e[i].to]=dep[u]+1;
			q.push(e[i].to);
		}
	}
	return dep[T];
}
int dfs(int u,int in){
	if(u==T) return in;
	int out=0;
	for(int &i=cur[u];i;i=e[i].link) if(e[i].w&&dep[e[i].to]==dep[u]+1){
		int res=dfs(e[i].to,min(e[i].w,in));
		e[i].w-=res,e[i^1].w+=res;
		in-=res,out+=res;
		if(!in) break;
	}
	return out;
}
int main(){
	scanf("%d",&n);
	for(int i=1,w;i<=n;i++){
		scanf("%d%d%d",&x[i],&y[i],&w),ty[i]=(x[i]&1)<<1|(y[i]&1);
		ru[i]=++cnt,chu[i]=++cnt,add_edge(ru[i],chu[i],w),ans+=w;
		if(ty[i]==2) add_edge(S,ru[i],inf);
		if(ty[i]==3) add_edge(chu[i],T,inf);
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if((i^j)&&abs(x[i]-x[j])<=1&&abs(y[i]-y[j])<=1){
		if((ty[i]==2&&ty[j]==0)||(ty[i]==0&&ty[j]==1)||(ty[i]==1&&ty[j]==3)) add_edge(chu[i],ru[j],inf);
	}
	while(bfs()) ans-=dfs(S,inf);
	printf("%lld\n",ans);
}
