#include <iostream>
#include <cstdio>
#include <cstring>
#include <unordered_map>
using namespace std;
const int MAXN=405;
typedef long long ll;
struct Node{
	int a,b,c,d;
}a[MAXN];
int n;
unordered_map<ll,int>mp;
inline ll gethsh(Node x)
{
	return (ll)x.a<<30|(ll)x.b<<20|(ll)x.c<<10|(ll)x.d;
}
ll hsh[MAXN];
bool flag=true;
inline void add(ll x,int v)
{
	for(int i=0;i<4;++i,x=(x>>10)|((x&1023)<<30))
		mp[x]+=v;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		Node x;
		scanf("%d%d%d%d",&x.a,&x.b,&x.c,&x.d);
		a[i]=x;
		hsh[i]=gethsh(x);
		add(hsh[i],1);
	}
	ll ans=0;
	for(int i=1;i<=n-5;++i){
		add(hsh[i],-1);
		Node x=a[i];
		for(int j=i+1;j<=n;++j){
			add(hsh[j],-1);
			Node y=a[j];
			for(int p2=0;p2<4;++p2){
				ll now=1;
				ll t[5]={0};
				t[0]=gethsh((Node){x.b,x.a,y.b,y.a});
				t[1]=gethsh((Node){x.c,x.b,y.a,y.d});
				t[2]=gethsh((Node){x.a,x.d,y.c,y.b});
				t[3]=gethsh((Node){x.d,x.c,y.d,y.c});
				for(int k=0;k<4;++k){
					int o=mp.count(t[k])?mp[t[k]]:0;
					now*=o;
					add(t[k],-1);
				}
				for(int k=0;k<4;++k)
					add(t[k],1);
				ans+=now;
				swap(y.a,y.b),swap(y.b,y.c),swap(y.c,y.d);
			}
			add(hsh[j],1);
		}
	}
	cout<<ans<<endl;
	return 0;
}
