#include<bits/stdc++.h>
#define lop(x,m,n) for(int x=m;x<=n;x++)
using namespace std;
int n;
struct node{
int x1,y1,x2,y2,se;
}sq[20];
int used[20]={0};
int maxx,maxy;
bool b[40][40]={0};
void init()
{
maxx=-1,maxy=-1;
scanf("%d",&n);
lop(i,1,n)
{
scanf("%d%d%d%d%d",&sq[i].x1,&sq[i].y1,&sq[i].x2,&sq[i].y2,&sq[i].se);
maxx=max(maxx,sq[i].x2);
maxy=max(maxy,sq[i].y2);
}
}
int ans=15;
bool check(int x)
{
if(sq[x].x1==0) return true;
lop(i,sq[x].y1+1,sq[x].y2)
{
if(b[sq[x].x1][i]==0)
{
return false;
}
}
return true;
}
void ss(int x)
{
lop(i,sq[x].x1+1,sq[x].x2)
lop(j,sq[x].y1+1,sq[x].y2)
b[i][j]=1;
}
void zz(int x)
{
lop(i,sq[x].x1+1,sq[x].x2)
lop(j,sq[x].y1+1,sq[x].y2)
b[i][j]=0;
}
void dfs(int k,int p,int num)//第k次拿笔,第p块方板 ,累积num块方板
{
if(k>ans) return;
if(num==n)
{
ans=min(ans,k);
}
lop(i,1,n)
{
if(!used[i]&&check(i))
{
used[i]=1;
ss(i);
num++;
if(sq[i].se!=sq[p].se)
{
k++;
dfs(k,i,num);
k--;
}
else{
dfs(k,i,num);
}
zz(i);
num--;
used[i]=0;
}
}
}
int main()
{
init();
dfs(0,0,0);
cout<<ans;
}