Problem:
Score : 600 points

Problem Statement

We have 3N cards arranged in a row from left to right, where each card has an integer between 1 and N (inclusive) written on it. The integer written on the i-th card from the left is A_i.

You will do the following operation N-1 times:

Rearrange the five leftmost cards in any order you like, then remove the three leftmost cards. If the integers written on those three cards are all equal, you gain 1 point.

After these N-1 operations, if the integers written on the remaining three cards are all equal, you will gain 1 additional point.

Find the maximum number of points you can gain.

Constraints

1 \leq N \leq 2000

1 \leq A_i \leq N

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \cdots A_{3N}

Output

Print the maximum number of points you can gain.

Sample Input 1

2
1 2 1 2 2 1

Sample Output 1

2

Let us rearrange the five leftmost cards so that the integers written on the six cards will be 2\ 2\ 2\ 1\ 1\ 1 from left to right.

Then, remove the three leftmost cards, all of which have the same integer 2, gaining 1 point.

Now, the integers written on the remaining cards are 1\ 1\ 1.

Since these three cards have the same integer 1, we gain 1 more point.

In this way, we can gain 2 points - which is the maximum possible.

Sample Input 2

3
1 1 2 2 3 3 3 2 1

Sample Output 2

1

Sample Input 3

3
1 1 2 2 2 3 3 3 1

Sample Output 3

3

Solution in C# (Mono-csc 3.5.0) (judge verdict: Wrong Answer)

using System;
using System.Linq;

class MainClass {
  
  public static void Main (string[] args) {
    int n = int.Parse(Console.ReadLine());
    long[] inputs = Console.ReadLine().Split(' ').Select<string,long>(long.Parse).ToArray();
    long totalPoint1  = 0 , totalPoint2 = 0;  
    Array.Resize(ref inputs, n * 3);
    long[] arr1 = inputs;
    long[] arr2 = inputs;
    long k = 0;
    while(true){
      long N = 5 > arr1.Length ? arr1.Length  : 5;
      for(long i = 0; i < N; i++){
        for(long j = i + 1; j < N; j++){
          if(arr1[i] > arr1[j]){
            long temp = arr1[i];
            arr1[i] = arr1[j];
            arr1[j] =temp;
          }

          if(arr2[i] < arr2[j]){
            long temp = arr2[i];
            arr2[i]  = arr2[j];
            arr2[j] = temp;
          }
        }
      }

       if(arr1.Length < 3) break;
      bool check1 = false , check2 = false;
      long val1 = arr1[0] , val2 = arr2[0]; 
      for(long i = 0; i < 3; i++){
        if(val1 != arr1[0]) check1 = true;
        if(val2 != arr2[0]) check2 = true;
        for(long j = 1; j < arr1.Length; j++ ){
          arr1[j - 1] = arr1[j];
          arr2[j - 1] = arr2[j];
        }
      }
      Array.Resize(ref arr1, arr1.Length - 3);
      Array.Resize(ref arr2, arr2.Length - 3);

      totalPoint1+= check1 ? 0 : 1;
      totalPoint2+= check2 ? 0 : 1;
    }

   
    Console.WriteLine(Math.Max(totalPoint1 , totalPoint2));
    
  }
}