/*
TASK:man
LANG:C++
*/

#include <iostream>
#include <vector>
#include <set>
using namespace std;

struct edge 
{ 
 int a,b; 
 edge()
 {
  a=-1;
  b=-1;
 }
 edge(int c, int d)
 {
  a=c;
  b=d;
 }
};

int main()
{
 int m,i,j,k,l=-1; cin>>m; edge mas[m];
 for (i=0;i<m;i++)
 {
  int pa,pb; cin>>pa>>pb;
  edge p(pa,pb);
  mas[i]=p;
  if (pa>l) l=pa;
  if (pb>l) l=pb;
 }
 
 /*vector < vector <int> > graph(l+1); 
 for (i=0;i<m;i++)
 {
  graph[mas[i].a].push_back(mas[i].b);
  graph[mas[i].b].push_back(mas[i].a);
 }*/
  
 int ans=m;
  
 for (i=0;i<m-2;i++)
  for (j=i+1;j<m-1;j++)
   for (k=j+1;k<m;k++)   
   {
    set <int> p; 
    p.insert(mas[i].a);
    p.insert(mas[i].b);
    p.insert(mas[j].a);
    p.insert(mas[j].b);
    p.insert(mas[k].a);
    p.insert(mas[k].b);
    if (p.size()==3) ans--;
   }
   
 cout<<ans<<endl;
  
 return 0;
}
