#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=200;
int n,ans;
struct Point{
ll x,y;
Point() {}
Point(ll _x,ll _y)
{
x=_x; y=_y;
}
Point operator -(const Point &b) const
{
return Point(x-b.x,y-b.y);
}
ll operator *(const Point &b) const
{
return x*b.x+y*b.y;
}
}p1[N],p2[N];
struct orz{
int s,d;};
ll r[N];
queue<orz>q;
bool vis[1<<20];
ll dis(Point a,Point b)
{
return (a-b)*(a-b);
}
bool Inter(int i,int j,int op)
{
Point O;
if (op==1) O=p2[j]; else O=p1[j];
Point O1=p1[i],O2=p2[i];
int R=r[j]+r[i];
if (dis(O1,O)<R*R || dis(O2,O)<R*R) return 0;
ll a,b,c,dis1,dis2,ang1,ang2;
if (O1.x==O2.x) a=1,b=0,c=-O1.x;
else if (O1.y==O2.y) a=0,b=1,c=-O1.y;
else a=O1.y-O2.y,b=O2.x-O1.x,c=O1.x*O2.y-O1.y*O2.x;
dis1=a*O.x+b*O.y+c;
dis1*=dis1;
dis2=(a*a+b*b)*(R*R);
if (dis1>=dis2) return 1;
ang1=(O.x-O1.x)*(O2.x-O1.x)+(O.y-O1.y)*(O2.y-O1.y);
ang2=(O.x-O2.x)*(O1.x-O2.x)+(O.y-O2.y)*(O1.y-O2.y);
if (ang1>0 && ang2>0)return 0;
return 1;
}
bool check(int x,int s)
{
bool flag=1;
for (int i=0;i<n;i++)
{
if (i==x) continue;
if (s&(1<<i)) flag&=Inter(x,i,1);
else flag&=Inter(x,i,2);
if (!flag) break;
}
return flag;
}
void bfs()
{
ans=0;
q.push({0,0});
vis[0]=1;
while (!q.empty())
{
orz now=q.front(); q.pop();
//for (int i=0;i<n;i++) cout<<((now.s>>i)&1); cout<<endl;
ans=max(ans,now.d);
for (int i=0;i<n;i++)
{
if ((now.s&(1<<i))==0 && !vis[now.s|(1<<i)] && check(i,now.s) )
{
q.push({now.s|(1<<i),now.d+1});
vis[now.s|(1<<i)]=1;
}
}
}
}
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%lld%lld%lld%lld%lld",&r[i],&p1[i].x,&p1[i].y,&p2[i].x,&p2[i].y);
bfs();
printf("%d\n",ans);
return 0;
}