Problem:
Score : 1200 points

Problem Statement

Snuke is playing with red and blue balls, placing them on a two-dimensional plane.

First, he performed N operations to place red balls. In the i-th of these operations, he placed RC_i red balls at coordinates (RX_i,RY_i).
Then, he performed another N operations to place blue balls. In the i-th of these operations, he placed BC_i blue balls at coordinates (BX_i,BY_i).
The total number of red balls placed and the total number of blue balls placed are equal, that is, \sum_{i=1}^{N} RC_i = \sum_{i=1}^{N} BC_i. Let this value be S.

Snuke will now form S pairs of red and blue balls so that every ball belongs to exactly one pair.
Let us define the score of a pair of a red ball at coordinates (rx, ry) and a blue ball at coordinates (bx, by) as |rx-bx| + |ry-by|.

Snuke wants to maximize the sum of the scores of the pairs.
Help him by finding the maximum possible sum of the scores of the pairs.

Constraints

1 \leq N \leq 1000

0 \leq RX_i,RY_i,BX_i,BY_i \leq 10^9

1 \leq RC_i,BC_i \leq 10

\sum_{i=1}^{N} RC_i = \sum_{i=1}^{N} BC_i

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
RX_1 RY_1 RC_1
RX_2 RY_2 RC_2
\vdots
RX_N RY_N RC_N
BX_1 BY_1 BC_1
BX_2 BY_2 BC_2
\vdots
BX_N BY_N BC_N

Output

Print the maximum possible sum of the scores of the pairs.

Sample Input 1

2
0 0 1
3 2 1
2 2 1
5 0 1

Sample Output 1

8

If we pair the red ball at coordinates (0,0) and the blue ball at coordinates (2,2), the score of this pair is |0-2| + |0-2|=4.
Then, if we pair the red ball at coordinates (3,2) and the blue ball at coordinates (5,0), the score of this pair is |3-5| + |2-0|=4.
Making these two pairs results in the total score of 8, which is the maximum result.

Sample Input 2

3
0 0 1
2 2 1
0 0 2
1 1 1
1 1 1
3 3 2

Sample Output 2

16

Snuke may have performed multiple operations at the same coordinates.

Sample Input 3

10
582463373 690528069 8
621230322 318051944 4
356524296 974059503 6
372751381 111542460 9
392867214 581476334 6
606955458 513028121 5
882201596 791660614 9
250465517 91918758 3
618624774 406956634 6
426294747 736401096 5
974896051 888765942 5
726682138 336960821 3
715144179 82444709 6
599055841 501257806 6
390484433 962747856 4
912334580 219343832 8
570458984 648862300 6
638017635 572157978 10
435958984 585073520 7
445612658 234265014 6

Sample Output 3

45152033546

Solution in JavaScript (node.js v5.12) (judge verdict: Accepted)

var GET=(function(){function f(s){return new g(s);}function g(s){this._s=s.trim().split("\n");this._y=0;}g.prototype.a=function(f){var s=this._s, y=this._y, r;if(typeof s[y]==="string")s[y]=s[y].split(" ").reverse();r=s[y].pop();if(!s[y].length)this._y++;return f?r:+r;};g.prototype.l=function(f){var s=this._s[this._y++].split(" ");return f?s:s.map(a=>+a);};g.prototype.m=function(n,f){var r=this._s.slice(this._y,this._y+=n).map(a=>a.split(" "));return f?r:r.map(a=>a.map(a=>+a));};g.prototype.r=function(n,f){var r=this._s.slice(this._y,this._y+=n);return f?r:r.map(a=>+a);};return f;})();
var o=GET(require("fs").readFileSync("/dev/stdin","utf8"));
function xArray(v){var a=arguments,l=a.length,r="Array(a["+--l+"]).fill(0).map(x=>{return "+v+";})";while(--l)r="Array(a["+l+"]).fill(0).map(x=>"+r+")";return eval(r);}
var priorityQueue=(function(){
  var h;
  function f(){return new PriorityQueue();}
  function PriorityQueue(){
    h=this.heap=[];
  }
  PriorityQueue.prototype.push=function(x){
    var i=h.length++,j;
    while(i){
      j=i-1>>1;
      if(h[j][0]<=x[0])break;
      h[i]=h[j],i=j;
    }
    h[i]=x;
  };
  PriorityQueue.prototype.pop=function(){
    var r=h[0],x=h.pop(),l=h.length,i=0,j;
    if(l===0)return r;
    var k=l>>1;l--;
    while(i<k){
      j=(i<<1)+1;
      if(j<l&&h[j+1][0]<h[j][0])j++;
      if(x[0]<=h[j][0])break;
      h[i]=h[j],i=j;
    }
    h[i]=x;
    return r;
  };
  return f;
})();
var MinCostFlow=(function(){
  var e,INF=1e15;
  function f(n){return new PrimalDual(n);}
  function PrimalDual(n){
    e=this.edge=Array(n).fill(0).map(a=>[]);
  }
  
  PrimalDual.prototype.add=function(from,to,cap,cost){
    e[from].push([to,cap,cost,e[to].length]);
    e[to].push([from,0,-cost,e[from].length-1]);
  }
  
  PrimalDual.prototype.minCostFlow=function(start,goal,flow){
    var s=start,g=goal,f=flow;
    var v=e.length,r=0,pq=priorityQueue();
    var potential=Array(v).fill(0);
    var preve=Array(v).fill(-1);
    var prevv=Array(v).fill(-1);
    while(f){
      var minCost=Array(v).fill(INF);
      minCost[s]=0;
      pq.push([0,s]);
      while(pq.heap.length){
        var p=pq.pop();
        if(minCost[p[1]]<p[0])continue;
        for(var i=0;i<e[p[1]].length;i++){
          var ei=e[p[1]][i];
          if(ei[1]<=0)continue;
          var nextCost=minCost[p[1]]+ei[2]+potential[p[1]]-potential[ei[0]];
          if(nextCost<minCost[ei[0]]){
            minCost[ei[0]]=nextCost;
            prevv[ei[0]]=p[1],preve[ei[0]]=i;
            pq.push([nextCost,ei[0]]);
          }
        }
      }
      if(minCost[g]===INF)return -1;
      for(var i=0;i<v;i++)potential[i]+=minCost[i];
      var addFlow=f;
      for(var i=g;i!==s;i=prevv[i]){
        if(e[prevv[i]][preve[i]][1]<addFlow)addFlow=e[prevv[i]][preve[i]][1];
      }
      f-=addFlow;
      r+=addFlow*potential[g];
      for(var i=g;i!=s;i=prevv[i]){
        var ei=e[prevv[i]][preve[i]];
        ei[1]-=addFlow;
        e[i][ei[3]][1]+=addFlow;
      }
    }
    return r;
  }
  return f;
})();

console.log(main());
function main(){
  var n = o.a();
  var flow = MinCostFlow(n*2+6);
  var s = 0;
  for(var i = 0; i < n; i++){
    var t = o.l(), x = t[0], y = t[1], c = t[2];
    s += c;
    flow.add(0,i+1,c,0);
    flow.add(i+1,n+1,1e4,x+y+2e9);
    flow.add(i+1,n+2,1e4,x-y+2e9);
    flow.add(i+1,n+3,1e4,-x+y+2e9);
    flow.add(i+1,n+4,1e4,-x-y+2e9);
  }
  for(var i = 0; i < n; i++){
    var t = o.l(), x = t[0], y = t[1], c = t[2];
    flow.add(n+i+5,2*n+5,c,0);
    flow.add(n+1,n+i+5,1e4,-x-y+2e9);
    flow.add(n+2,n+i+5,1e4,-x+y+2e9);
    flow.add(n+3,n+i+5,1e4,x-y+2e9);
    flow.add(n+4,n+i+5,1e4,x+y+2e9);
  }
  return 4e9*s-flow.minCostFlow(0,2*n+5,s);
}