#include<bits/stdc++.h>
using namespace std;
  
long long ans=0;
int n;
struct Node{
    int a[5];
    Node(int i,int j,int k,int l){
        a[0]=i,a[1]=j,a[2]=k,a[3]=l;
    }
    Node(){}
    int &operator[](const int &x){return a[x];}
    bool operator<(const Node &b)const{
        if(a[0]!=b.a[0])return a[0]<b.a[0];
        else if(a[1]!=b.a[1])return a[1]<b.a[1];
        else if(a[2]!=b.a[2])return a[2]<b.a[2];
        else return a[3]<b.a[3];
    }
}col[405];
map<Node,int> cnt;
 
void add(Node x,int k){
    cnt[Node(x[0],x[1],x[2],x[3])]+=k;
    cnt[Node(x[1],x[2],x[3],x[0])]+=k;
    cnt[Node(x[2],x[3],x[0],x[1])]+=k;
    cnt[Node(x[3],x[0],x[1],x[2])]+=k;
}
  
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d%d",&col[i][0],&col[i][1],&col[i][2],&col[i][3]);
        add(col[i],1);
    }
    for(int i=1;i<=n-1;i++){
        add(col[i],-1);
        for(int j=i+1;j<=n;j++){
            add(col[j],-1);
            for(int k=0;k<4;k++){
                Node num[5];
                for(int l=0;l<4;l++)
                    num[l]=Node(col[i][l],col[j][k+5-l&3],col[j][k+4-l&3],col[i][l+1&3]);
                if(!cnt[num[0]]||!cnt[num[1]]||!cnt[num[2]]||!cnt[num[3]])continue;
                long long tmp=1;
                for(int l=0;l<4;l++)tmp*=cnt[num[l]],add(num[l],-1);
                for(int l=0;l<4;l++)add(num[l],1);
                ans+=tmp;
            }
            add(col[j],1);
        }
    }
    printf("%lld\n",ans);
    return 0;
}
