#include<bits/stdc++.h>
#define MN 2000
#define pa pair<ll,int>
#define mp(x,y) make_pair(x,y)
#define ll long long
#define INF 1000000000000000000LL
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
ll ans,g[5][5],G[5][5];
pa p1[MN+5],p2[MN+5],op[4],OP[4],opt[4][4],OPT[4][4];
int n,n1[MN+5],n2[MN+5],tot,vis[4],now,q[9],top,from[4];
multiset<pa,greater<pa> > s1[4][4],s2[4][4],S1[4],S2[4];
inline int S(int x){return x?1:-1;}
inline ll Val(pa pos,int kind){return S(kind&1)*pos.first+S(kind&2)*pos.second;}
void Choose1(int x,int y)
{
    for(int i=0;i<4;++i) if(i!=y)
        s1[y][i].insert(mp(Val(p1[x],i)-Val(p1[x],y),x));
}
void Choose2(int x,int y)
{
    for(int i=0;i<4;++i) if(i!=y)
        s2[y][i].insert(mp(Val(p2[x],i^3)-Val(p2[x],y^3),x));
}
void Revert1(int x,int y)
{
    for(int i=0;i<4;++i) if(i!=y)
        s1[y][i].erase(s1[y][i].lower_bound(mp(Val(p1[x],i)-Val(p1[x],y),x)));
}
void Revert2(int x,int y)
{
    for(int i=0;i<4;++i) if(i!=y)
        s2[y][i].erase(s2[y][i].lower_bound(mp(Val(p2[x],i^3)-Val(p2[x],y^3),x)));
}
int main()
{
    n=read();
    for(int i=1;i<=n;++i) p1[i].first=read(),p1[i].second=read(),n1[i]=read(),tot+=n1[i];
    for(int i=1;i<=n;++i) p2[i].first=read(),p2[i].second=read(),n2[i]=read();
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<4;++j) for(int k=1;k<=n1[i];++k) S1[j].insert(mp(Val(p1[i],j),i));
        for(int j=0;j<4;++j) for(int k=1;k<=n2[i];++k) S2[j].insert(mp(Val(p2[i],j^3),i));
    }
    while(tot--)
    {
        for(int i=0;i<4;++i) op[i]=*S1[i].begin();
        for(int i=0;i<4;++i) OP[i]=*S2[i].begin();
        for(int i=0;i<4;++i) for(int j=0;j<4;++j)
            g[i][j]=(opt[i][j]=s1[i][j].empty()?mp(-INF,0):*s1[i][j].begin()).first,
            G[i][j]=(OPT[i][j]=s2[i][j].empty()?mp(-INF,0):*s2[i][j].begin()).first;
        for(int i=0;i<4;++i) for(int j=0;j<4;++j) g[i][j]=max(g[i][j],G[j][i]);
        for(int i=0;i<4;++i) g[i][i]=G[i][i]=0;
        for(int k=0;k<4;++k) for(int i=0;i<4;++i) for(int j=0;j<4;++j)
            if(g[i][k]+g[k][j]>g[i][j]) g[i][j]=g[i][k]+g[k][j];
        int A,B;ll mx=-1e18;
        for(int i=0;i<4;++i) for(int k=0;k<4;++k)
            if(op[i].first+OP[k].first+g[i][k]>mx)
                mx=op[i].first+OP[k].first+g[i][k],A=i,B=k;
        ans+=mx;int D=op[A].second,E=OP[B].second;
        for(int i=0;i<4;++i)
            S1[i].erase(S1[i].lower_bound(mp(Val(p1[D],i),D))),
            S2[i].erase(S2[i].lower_bound(mp(Val(p2[E],i^3),E))); 
        Choose1(D,A);Choose2(E,B);
        q[top=1]=A;++now;vis[A]=now;
        for(int l=1;l<=top;++l)
        {
            int i=q[l];
            for(int j=0;j<4;++j) if(vis[j]!=now&&g[A][i]+max(opt[i][j].first,OPT[j][i].first)+g[j][B]==g[A][B])
                q[++top]=j,vis[j]=now,from[j]=i;
        }
        for(int i=B;i!=A;i=from[i])
        {
            int j=from[i],c;
            if(g[A][j]+opt[j][i].first+g[i][B]==g[A][B])
                c=opt[j][i].second,Revert1(c,j),Choose1(c,i);
            else c=OPT[i][j].second,Revert2(c,i),Choose2(c,j);
        }
    }
    cout<<ans;
	return 0;
}

Measured memory_bytes: 5248