#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <functional>
#include <numeric>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>
#include <fstream>

using namespace std;

#define FOR(i,a,b) for(long long i=(a);i<(b);i++)
#define REP(i,N) for(long long i=0;i<(N);i++)
#define ALL(s) (s).begin(),(s).end()
#define fi first
#define se second

#define PI acos(-1.0)
#define INF 1000000007
#define EPS 1e-10
#define MAX_M 100100

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<double, double> PD;
typedef pair<string, ll> PS;
typedef vector<ll> V;
typedef pair<P, char> PC;

struct Dice{
	string me[6];
	
	void Init(string a[6]){
		for (int i = 0; i < 6; i++){
			me[i] = a[i];
		}
	}

	bool check(Dice d2){
		for (int i = 0; i < 6; i++){
			if (d2.me[i] != me[i])return false;
		}
		return true;
	}

	void print(){
		for (int i = 0; i < 6; i++){
			cout << me[i] << " ";
		}
		cout << endl;
	}
};

int n;
string a[6];
Dice d[110];
bool F[100];

int main(){
	while (cin >> n&&n){
		fill(F, F + 100, 1);
		REP(i, n){
			REP(j, 6)cin >> a[j];
			d[i].Init(a);
		}
		bool f = 0;
		REP(k, n){
			if (F[k]){
				FOR(l, k + 1, n){
					REP(i, 4){
						REP(j, 4){
							if (d[k].check(d[l]))F[l] = 0;
							swap(d[k].me[1], d[k].me[2]);
							swap(d[k].me[2], d[k].me[4]);
							swap(d[k].me[4], d[k].me[3]);
						}
						REP(j, 4){
							if (d[k].check(d[l]))F[l] = 0;
							swap(d[k].me[0], d[k].me[1]);
							swap(d[k].me[1], d[k].me[5]);
							swap(d[k].me[5], d[k].me[4]);
						}
						swap(d[k].me[0], d[k].me[2]);
						swap(d[k].me[2], d[k].me[5]);
						swap(d[k].me[5], d[k].me[3]);
					}
				}
			}
		}
		int co = 0;
		REP(i, n)if (F[i])co++;
		cout << n - co << endl;
	}
}