//题意 :4堆糖果每堆n个 有一个能放5个candy的basket 如果basket中有两个颜色相同candy,则可以把这一对放进口袋,求口袋中最多有多少对candy
//dp[a][b][c][d] candy中状态为a,b,c,d时(拿了a,b,c,d),口袋中最多有多少对 ,颜色相同用位运算&即可(颜色<=40) 状态转移:向某一堆拿candy
#include <bits/stdc++.h>
using namespace std;
const int N=45;
int n,a[N][4];
int dp[N][N][N][N];
int DP(int *top,int st,int k)//k为basket中candy个数
{
int &m=dp[top[0]][top[1]][top[2]][top[3]];
if(m!=-1) return m;
if(top[0]==n&&top[1]==n&&top[2]==n&&top[3]==n||k==5)
return m=0;
for(int i=0;i<4;i++)//状态转移:向某一堆拿candy
{
if(top[i]<n)
{
int bit=1<<a[top[i]][i];//颜色
top[i]++;
if(bit&st)//basket中有相同颜色
m=max(m,DP(top,st-bit,k-1)+1);
else if(k<5)
m=max(m,DP(top,st+bit,k+1));
top[i]--;//回溯
}
}
return m;
}
int main()
{
while(cin>>n&&n)
{
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
int top[5]={0};//记录每堆中拿了几个
printf("%d\n",DP(top,0,0));
}
return 0;
}