#include<iostream>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<functional>
using namespace std;
const int N = 6;
struct T{string f[N];}c,d,e;

bool operator<(const T&l,const T&r)
{
	for(int i=0;i<N;++i)
	{
		if(l.f[i]<r.f[i]) return true;
		else if(l.f[i]>r.f[i]) return false;
	}
	return false;
}
void r(T&r,int a[4])
{
	string t = r.f[a[0]];
	for(int i=1;i<4;++i) r.f[a[i-1]] = r.f[a[i]];
	r.f[a[3]]=t;
}
int main()
{
	int n,i,j,k,a[N][4]={
		{1,2,4,3},
		{0,2,5,3},
		{0,1,5,4},
		{0,1,5,4},
		{0,2,5,3},
		{1,2,4,3},
	};
	while(cin>>n,n)
	{
		set<T>s;
		for(i=0;i<n;++i)
		{
			for(j=0;j<N;++j)cin>>c.f[j];
			
			d=c;
			for(j=0;j<4;++j)
			{
				r(d, a[0]);
				for(k=0;k<4;++k)
				{
					r(d,a[1]);
					s.insert(d);
				}
			}
			for(j=0;j<4;++j)
			{
				r(d,a[2]);
				for(k=0;k<4;++k)
				{
					r(d,a[1]);
					s.insert(d);
				}
			}
			;
		}
		printf("%d\n",n-s.size()/24);
	}
	return 0;
}