Problem: 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.

Examples

Input

2
1 2 1 2 2 1


Output

2


Input

3
1 1 2 2 3 3 3 2 1


Output

1


Input

3
1 1 2 2 2 3 3 3 1


Output

3

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#include <string>
#include <vector>
#include <algorithm>
#define rep(i,n) for (int i = 0;i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int,int>;
int INF = 1e9;
void chmax(int& a, int b) { a = max(a, b);}
void chmin(int& a,int b) {a = min(a,b);}

int main(){
    int n;cin >> n;
    vector<vector<int>> dp(2005,vector<int>(2005,-INF));
    vector<int> a(3*n);rep(i,3*n) cin >> a[i],--a[i];

    int m = n+1;
    auto upd = [&](int i,int j,int x){
        chmax(dp[i][j],x);
        chmax(dp[j][i],x);
        chmax(dp[j][n],x);
        chmax(dp[n][j],x);
        chmax(dp[i][n],x);
        chmax(dp[n][i],x);
        chmax(dp[n][n],x);
    };

    upd(a[0],a[1],0);
    int base = 0;
    for(int ai = 2;ai < 3*n-1;ai += 3){
        int x = a[ai],y = a[ai+1],z = a[ai+2];
        if(x == y && y == z) {
            base++;
            continue;
        }
        vector<tuple<int,int,int>> q;
        rep(ri,3){
            {
                rep(b,m){
                    int now = dp[b][n];
                    if(y == z) chmax(now,dp[b][y]+1);
                    q.emplace_back(b,x,now);
                }
            }
            {
                int now = max(dp[n][n],dp[z][z]+1);
                q.emplace_back(x,y,now); 
            }
            swap(x,y);swap(y,z);
        }
        for(auto t:q){
            int i,j,k;
            tie(i,j,k) = t;
            upd(i,j,k);
        }
    }
    int ans = dp[n][n];
    int l = a[3*n-1];
    chmax(ans,dp[l][l]+1);
    cout << ans+base << endl;   
}