#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

deque<int> f(deque<int> d) {
	deque<int> ret = d;
	for(int i = 0; i < 3; i++) {
		d.push_back(d.front());
		d.pop_front();
		ret = min(ret, d);
	}
	return ret;
}

int count_overlap(deque<int> d) {
	int ret = 1;
	deque<int> t = d;
	for(int i = 0; i < 3; i++) {
		d.push_back(d.front());
		d.pop_front();
		if(t == d) ret++;
	}
	return ret;
}

deque<int> C[400];

ll P(int n, int k) {
	ll ret = 1;
	for(int i = n - k + 1; i <= n; i++) {
		ret *= i;
	}
	return ret;
}

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	int N;
	cin >> N;

	map<deque<int>, int> m;
	map<deque<int>, int> cnt;
	for(int i = 0; i < N; i++) {
		deque<int> d;
		for(int j = 0; j < 4; j++) {
			int c;
			cin >> c;
			d.push_back(c);
		}
		d = f(d);
		C[i] = d;
		m[d]++;
	}

	for(auto p : m) {
		cnt[p.first] = count_overlap(p.first);
	}

	ll ans = 0;
	for(int i = 0; i < N; i++) {
		deque<int> d1 = C[i];
		m[d1]--;
		for(int j = 0; j < N; j++) {
			if(i == j) continue;
			deque<int> d2 = C[j];
			m[d2]--;
			for(int r1 = 0; r1 < 4; r1++) {
				map<deque<int>, int> t;
				deque<int> p1({ d1[1], d1[0], d2[1], d2[0] });
				deque<int> p2({ d1[0], d1[3], d2[2], d2[1] });
				deque<int> p3({ d1[3], d1[2], d2[3], d2[2] });
				deque<int> p4({ d1[2], d1[1], d2[0], d2[3] });
				t[f(p1)]++;
				t[f(p2)]++;
				t[f(p3)]++;
				t[f(p4)]++;
				ll k = 1;
				for(auto p : t) {
					if(!m.count(p.first) || m[p.first] < p.second) {
						k = 0;
						break;
					}
					k *= P(m[p.first], p.second);
					for(int loop = 0; loop < p.second; loop++) {
						k *= cnt[p.first];
					}
				}
				ans += k;
				d1.push_back(d1[0]);
				d1.pop_front();
			}
			m[d2]++;
		}
		m[d1]++;
	}

	cout << ans / 6 << endl;
}