




/*
windows下long long 用I64d,不长记性!
斜率没有的时候那个赋值不能用-1,因为有可能有斜率为-1的直线(虽然这题数据里没有。要赋成负无穷
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#define INF 1e9+5
using namespace std;
#define ll long long
int n;
double b[100010];
map<double,ll>a;
ll c(int n,int m)
{
if(n<m)return 0;
ll s=1,i;
for(i=n;i>=n-m+1;i--)s*=i;
for(i=1;i<=m;i++)s/=i;
return s;
}
int main()
{
freopen("trokuti.in","r",stdin);
freopen("trokuti.out","w",stdout);
scanf("%d",&n);
ll tot=0,k;
for(int i=1;i<=n;i++)
{
ll A,B,C;
scanf("%I64d%I64d%I64d",&A,&B,&C);
if(B==0)
a[-INF]++;//记录没有斜率的直线
else
{
double q=(double(A)/B)*1.0;//不是真正的斜率,只是一个比值
if(a[q]==0) b[++tot]=q;//tot记录不同斜率直线的种类
a[q]++;//斜率同为q的直线有多少条
}
}
if(a[-INF]) b[++tot]=-INF;//如果有无斜率的直线,那么再加一种斜率
ll ans=c(n,3);
for(int i=1;i<=tot;i++)
{
k=a[b[i]];
ans-=c(k,3);//三边平行或重合
ans-=c(k,2)*(n-k);//两边平行或重合
}
printf("%I64d",ans);
fclose(stdin);fclose(stdout);
return 0;
}