//by yjz
#include<bits/stdc++.h>
#define FF first
#define SS second
#define MP make_pair
#define PB push_back
typedef long long ll;
using namespace std;
const int maxn = 1011;
namespace Flow
{
	const int maxv = 2022;
	const int maxe = 20022;
	const ll inf = 1e18;
	int head[maxv], nxt[maxe], to[maxe], cap[maxe], cost[maxe], tot=1;
	void add_edge(int x, int y, int c, int w)
	{
		nxt[++tot] = head[x];
		head[x] = tot;
		to[tot] = y;
		cap[tot] = c;
		cost[tot] = w;
		swap(x, y);
		nxt[++tot] = head[x];
		head[x] = tot;
		to[tot] = y;
		cap[tot] = 0;
		cost[tot] = -w;
	}
	ll dis[maxv];
	bool inq[maxv];
	int q[maxv], qb, qe;
	void update()
	{
		if (qb==qe) return;
		int lst = qe-1;
		if (lst<0) lst = maxv-1;
		if (dis[q[qb]]>dis[q[lst]]) swap(q[qb], q[lst]);
	}
	void spfa(int S)
	{
		for (int i=0; i<maxv; i++) dis[i] = inf;
		qb = qe = 0;
		q[qe++] = S; inq[S] = true;
		dis[S] = 0;
		while (qb!=qe)
		{
			int x = q[qb++];
			inq[x] = false;
			if (qb>=maxv) qb = 0;
			update();
			for (int i=head[x]; i; i=nxt[i])
			{
				if (cap[i]&&dis[to[i]]>dis[x]+cost[i])
				{
					dis[to[i]] = dis[x]+cost[i];
					if (!inq[to[i]])
					{
						inq[to[i]] = true;
						q[qe++] = to[i];
						if (qe>=maxv) qe = 0;
						update();
					}
				}
			}
		}
	}
	bool vis[maxv];
	int dfs(int x, int T, int f)
	{
		if (x==T) return f;
		int of = f;
		vis[x] = true;
		for (int i=head[x]; i; i=nxt[i])
		{
			int u = to[i];
			if (!vis[u]&&cap[i]&&dis[u]==dis[x]+cost[i])
			{
				int d = dfs(u, T, min(f, cap[i]));
				cap[i] -= d;
				cap[i^1] += d;
				f -= d;
				if (!f) return of;
			}
		}
		return of-f;
	}
	ll min_cost_max_flow(int S, int T)
	{
		ll ret = 0;
		while (true)
		{
			spfa(S);
			if (dis[T]==inf) return ret;
			while (true)
			{
				memset(vis, 0, sizeof(vis));
				int f = dfs(S, T, 233333333);
				if (f==0) break;
				ret += 1ll*f*dis[T];
			}
		}
	}
}
int n;
pair<int,int> a[maxn], b[maxn];
int cnta[maxn], cntb[maxn];

int main()
{
	scanf("%d", &n);
	for (int i=1; i<=n; i++) scanf("%d%d%d", &a[i].FF, &a[i].SS, &cnta[i]); 
	for (int i=1; i<=n; i++) scanf("%d%d%d", &b[i].FF, &b[i].SS, &cntb[i]);
	int S = n+n+5, T = n+n+6;
    for (int i=1; i<=n; i++)
	{
		Flow::add_edge(S, i, cnta[i], 0);
		Flow::add_edge(n+i, T, cntb[i], 0);
		Flow::add_edge(i, n+n+1, 1e9, a[i].FF+a[i].SS);
		Flow::add_edge(n+n+1, n+i, 1e9, -b[i].FF-b[i].SS);
		Flow::add_edge(i, n+n+2, 1e9, a[i].FF-a[i].SS);
		Flow::add_edge(n+n+2, n+i, 1e9, -b[i].FF+b[i].SS);
		Flow::add_edge(i, n+n+3, 1e9, -a[i].FF+a[i].SS);
		Flow::add_edge(n+n+3, n+i, 1e9, b[i].FF-b[i].SS);
		Flow::add_edge(i, n+n+4, 1e9, -a[i].FF-a[i].SS);
		Flow::add_edge(n+n+4, n+i, 1e9, b[i].FF+b[i].SS);
	}
	cout<<-Flow::min_cost_max_flow(S, T)<<endl;
	return 0;
}