#include<bits/stdc++.h>

using namespace std;

typedef pair<int ,int> pii;
const long long INF = 10000000000000000ll;

namespace Flow{
	const int maxv=2005;
	const int maxe=20080;
	int S,T,V,tot;
	int head[maxv],nxt[maxe<<1],to[maxe<<1],cap[maxe<<1];
	int lvl[maxv],que[maxv],cur[maxv];
	void init(){
		tot=0;
		memset(head,-1,sizeof(head));
	}
	void addedge(int u,int v,int c){
		nxt[tot]=head[u];to[tot]=v;cap[tot]=c;head[u]=tot++;
		nxt[tot]=head[v];to[tot]=u;cap[tot]=0;head[v]=tot++;
	}
	bool bfs(){
		for(int i=0;i<V;i++)lvl[i]=-1;
		lvl[S]=0;
		int ql=0,qr=0;
		que[qr++]=S;
		while(ql<qr){
			int x=que[ql++];
			for(int i=head[x];~i;i=nxt[i])if(cap[i]&&lvl[to[i]]<0)
				lvl[to[i]]=lvl[x]+1,que[qr++]=to[i];
		}
		return lvl[T]>=0;
	}
	int dfs(int x,int f){
		if(x==T)return f;
		for(int &i=cur[x];~i;i=nxt[i])if(cap[i]&&lvl[to[i]]==lvl[x]+1){
			int d=dfs(to[i],min(f,cap[i]));
			if(d){
				cap[i]-=d;
				cap[i^1]+=d;
				return d;
			}
		}
		return 0;
	}
	long long work(){
		long long res=0;
		while(bfs()){
			for(int i=0;i<V;i++)cur[i]=head[i];
			int f;
			while((f=dfs(S,INF))>0)res+=f;
		}
		return res;
	}
} 

int n, w[1005], z[1005];
long long x[1005], y[1005];
long long rlt;
int main() {
//	freopen("in.txt","r",stdin);
	int i,j;
	long long o;
	o=0;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>x[i]>>y[i]>>w[i];
		if(x[i]&1)
			z[i]+=2;
		if(y[i]&1)
			z[i]++;
		o+=w[i];
	}

	Flow::S=n<<1;Flow::T=n<<1|1;Flow::V=Flow::T+1;
	Flow::init();
	for(i=0;i<n;i++){
		Flow::addedge(i*2,i*2+1,w[i]);
		if(z[i]==2)
			Flow::addedge(Flow::S,i*2, INF);
		if(z[i]==3)
			Flow::addedge(i*2+1,Flow::T, INF);
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(abs(x[i]-x[j])+abs(y[i]-y[j])<=1){
				if(z[i]==2&&z[j]==0)
					Flow::addedge(i*2+1,j*2, INF);
				if(z[i]==0&&z[j]==1)
					Flow::addedge(i*2+1,j*2, INF);
				if(z[i]==1&&z[j]==3)
					Flow::addedge(i*2+1,j*2, INF);
			}
		}
	}
	cout<<o-Flow::work();
	return 0;
}

