// Slower C++ solution:
#include<queue>

#include<cstdio>

#include<vector>

#include<cstring>

#include<algorithm>

using namespace std;



int read(){

    int x=0;bool f=0;char c=getchar();

    while(c<'0'||c>'9') f|=c=='-',c=getchar();

    while(c>='0'&&c<='9') x=x*10+(c^48),c=getchar();

    return f?-x:x;

}



#define MAXN 50000

#define MAXM 1000000

#define INF 1ll<<60

#define int long long

struct Edge{

    int v,w,c,Next;

}E[MAXM+5];

int Adj[MAXN+5],ecnt;

void AddEdge(int u,int v,int Cap,int Cost){

    E[ecnt].v=v,E[ecnt].w=Cap,E[ecnt].c= Cost,E[ecnt].Next=Adj[u],Adj[u]=ecnt++;

    E[ecnt].v=u,E[ecnt].w=0,  E[ecnt].c=-Cost,E[ecnt].Next=Adj[v],Adj[v]=ecnt++;

}



int pre[MAXN+5];

int Dist[MAXN+5];

bool vis[MAXN+5];

int cnt[MAXN+5];

bool SPFA(int S,int T,int N,int &Flow,int &Cost){

    for(int i=0;i<=N;i++)

        Dist[i]=INF,pre[i]=-1,vis[i]=0,cnt[i]=0;

    queue<int> Q;

    Q.push(S);

    Dist[S]=0,vis[S]=1;

    while(!Q.empty()){

        int u=Q.front();Q.pop();vis[u]=0;

        for(int i=Adj[u];i!=-1;i=E[i].Next){

            int v=E[i].v,c=E[i].c;

            if(E[i].w&&Dist[v]>Dist[u]+c){

                Dist[v]=Dist[u]+c;

                pre[v]=i;

                if(!vis[v]){

                    ++cnt[v];

                    vis[v]=1,Q.push(v);

                }

            }

        }

    }

    if(Dist[T]==INF)

        return 0;

    int Min=INF;

    for(int i=pre[T];i!=-1;i=pre[E[i^1].v])

        Min=min(Min,E[i].w);

    for(int i=pre[T];i!=-1;i=pre[E[i^1].v])

        E[i].w-=Min,E[i^1].w+=Min,Cost+=E[i].c*Min;

    Flow+=Min;

    return 1;

}

pair<int,int> Dinic(int S,int T,int N){

    int Flow=0,Cost=0;

    while(1)

        if(!SPFA(S,T,N,Flow,Cost))

            break;

    return make_pair(Flow,Cost);

}



#undef MAXN

#undef MAXM



#define MAXM 1000

int N,M,K;

int A[MAXM+5];



signed main(){

    N=read();

    ecnt=0;

    memset(Adj,-1,sizeof Adj);

    for(int i=1;i<=N;i++){

        int x=read(),y=read(),c=read();

        AddEdge(1,i+1,c,0);

        AddEdge(i+1,N+2,INF,x+y);

        AddEdge(i+1,N+3,INF,-x+y);

        AddEdge(i+1,N+4,INF,x-y);

        AddEdge(i+1,N+5,INF,-x-y);

    }

    for(int i=1;i<=N;i++){

        int x=read(),y=read(),c=read();

        AddEdge(i+5+N,2*N+6,c,0);

        AddEdge(N+2,i+5+N,INF,-x-y);

        AddEdge(N+3,i+5+N,INF,x-y);

        AddEdge(N+4,i+5+N,INF,-x+y);

        AddEdge(N+5,i+5+N,INF,x+y);

    }

    printf("%lld",-Dinic(1,2*N+6,2*N+6).second);

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1756980389388425x):
#include<queue>

#include<cstdio>

#include<vector>

#include<cstring>

#include<algorithm>

using namespace std;



int read(){

    int x=0;bool f=0;char c=getchar();

    while(c<'0'||c>'9') f|=c=='-',c=getchar();

    while(c>='0'&&c<='9') x=x*10+(c^48),c=getchar();

    return f?-x:x;

}



#define MAXN 50000

#define MAXM 1000000

#define INF 1ll<<60

#define LL long long

struct Edge{

    LL w,c;

    int v,Next;

}E[MAXM+5];

int Adj[MAXN+5],ecnt;

void AddEdge(int u,int v,LL Cap,LL Cost){

    E[ecnt].v=v,E[ecnt].w=Cap,E[ecnt].c= Cost,E[ecnt].Next=Adj[u],Adj[u]=ecnt++;

    E[ecnt].v=u,E[ecnt].w=0,  E[ecnt].c=-Cost,E[ecnt].Next=Adj[v],Adj[v]=ecnt++;

}



int pre[MAXN+5];

LL Dist[MAXN+5];

bool vis[MAXN+5];

int cnt[MAXN+5];

bool SPFA(int S,int T,int N,LL &Flow,LL &Cost){

    for(int i=0;i<=N;i++)

        Dist[i]=INF,pre[i]=-1,vis[i]=0,cnt[i]=0;

    queue<int> Q;

    Q.push(S);

    Dist[S]=0,vis[S]=1;

    while(!Q.empty()){

        int u=Q.front();Q.pop();vis[u]=0;

        for(int i=Adj[u];i!=-1;i=E[i].Next){

            int v=E[i].v,c=E[i].c;

            if(E[i].w&&Dist[v]>Dist[u]+c){

                Dist[v]=Dist[u]+c;

                pre[v]=i;

                if(!vis[v]){

                    ++cnt[v];

                    vis[v]=1,Q.push(v);

                }

            }

        }

    }

    if(Dist[T]==INF)

        return 0;

    LL Min=INF;

    for(int i=pre[T];i!=-1;i=pre[E[i^1].v])

        Min=min(Min,(LL)E[i].w);

    for(int i=pre[T];i!=-1;i=pre[E[i^1].v])

        E[i].w-=Min,E[i^1].w+=Min,Cost+=Min*E[i].c;

    Flow+=Min;

    return 1;

}

pair<LL,LL> Dinic(int S,int T,int N){

    LL Flow=0,Cost=0;

    while(1)

        if(!SPFA(S,T,N,Flow,Cost))

            break;

    return make_pair(Flow,Cost);

}



#undef MAXN

#undef MAXM



#define MAXM 1000

int N,M,K;

int A[MAXM+5];



int main(){

    N=read();

    ecnt=0;

    memset(Adj,-1,sizeof Adj);

    for(int i=1;i<=N;i++){

        int x=read(),y=read(),c=read();

        AddEdge(1,i+1,c,0);

        AddEdge(i+1,N+2,INF,x+y);

        AddEdge(i+1,N+3,INF,-x+y);

        AddEdge(i+1,N+4,INF,x-y);

        AddEdge(i+1,N+5,INF,-x-y);

    }

    for(int i=1;i<=N;i++){

        int x=read(),y=read(),c=read();

        AddEdge(i+5+N,2*N+6,c,0);

        AddEdge(N+2,i+5+N,INF,-x-y);

        AddEdge(N+3,i+5+N,INF,x-y);

        AddEdge(N+4,i+5+N,INF,-x+y);

        AddEdge(N+5,i+5+N,INF,x+y);

    }

    printf("%lld",-Dinic(1,2*N+6,2*N+6).second);

    return 0;

}