#include <iostream>
#include <math.h>
#include <fstream>
#include<limits.h>
#include<queue>
using namespace std;
struct Segment{
double unghi1,unghi2;
};
int intersectie(double x1,double y1,double x2,double y2)
{
double max,min;
max=x1;
min=y1;
if(x2>max)
max=x2;
if(y2<min)
min=y2;
if (max<=min)
return 1;
else
return 0;
}
double unghi(long long x ,long long y)
{
double param;
param=x/sqrt((double)(x*x+y*y));
return acos (param) * 180.0 / 3.14;
}
struct comparator {
bool operator()(Segment seg1, Segment seg2) {
return seg1.unghi1 > seg2.unghi1;
}
};
int main()
{
double unghi1,unghi2,min1=0,max1=180,min2=0,max2=180;
long long aux,a,b,i,n,x,y1,y2,nr1=0,nr2=0,lungime1=0,lungime2=0;
Segment seg;
priority_queue<Segment, std::vector<Segment>, comparator> minHeap1;
priority_queue<Segment, std::vector<Segment>, comparator> minHeap2;
FILE *f = fopen("rays.in","r");
FILE *g = fopen("rays.out","w");
fscanf(f,"%lld",&n);
for(i=1;i<=n;i++)
{
fscanf(f,"%lld%lld%lld",&x,&y1,&y2);
if(y1<y2)
{
aux=y1;
y1=y2;
y2=aux;
}
if(x>=0)
{
if(y1>=0)
unghi1 = 90-unghi(x,y1);
else
unghi1 = 180-unghi(x,y1);
if(y2>=0)
unghi2 = 90-unghi(x,y2);
else
unghi2 = 180-unghi(x,y2);
}
else
{
if(y1>=0)
unghi1 = 90-unghi(-x,y1);
else
unghi1 = 180-unghi(-x,y1);
if(y2>=0)
unghi2 = 90-unghi(-x,y2);
else
unghi2 = 180-unghi(-x,y2);
}
if(x>0)
{
seg.unghi1 = unghi1;
seg.unghi2 = unghi2;
minHeap1.push(seg);
}
else
{
seg.unghi1 = unghi1;
seg.unghi2 = unghi2;
minHeap2.push(seg);
}
}
for(i=0;i<minHeap1.size();i++)
{
seg = minHeap1.top();
if(intersectie(min1,max1,seg.unghi1,seg.unghi2)==0)
{
nr1++;
}
minHeap1.pop();
}
for(i=0;i<minHeap2.size();i++)
{
seg = minHeap2.top();
if(intersectie(min2,max2,seg.unghi1,seg.unghi2)==0)
{
nr2++;
}
minHeap2.pop();
}
fprintf(g,"%lld",nr1+nr2+2);
return 0;
}