#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
bool func2(string s1[7], string s2[7]);
bool func3(string s1[7], string s2[7]);
void rtt(string s[7]);
void swp(string s[7], int u, int v);

bool func(string s1[7], string s2[7])
{
	if(!func2(s1, s2)){
		return false;
	}
	
	swp(s2, 1, 6);
	if(!func2(s1, s2)){
		return false;
	}
	swp(s2, 1, 6);
	
	swp(s2, 1, 2);
	swp(s2, 5, 6);
	if(!func2(s1, s2)){
		return false;
	}
	
	swp(s2, 2, 5);
	if(!func2(s1, s2)){
		return false;
	}
	swp(s2, 2, 5);
	swp(s2, 1, 2);
	swp(s2, 5, 6);
	
	swp(s2, 1, 3);
	swp(s2, 4, 6);
	if(!func2(s1, s2)){
		return false;
	}
	swp(s2, 3, 4);
	if(!func2(s1, s2)){
		return false;
	}
	swp(s2, 3, 4);
	swp(s2, 1, 3);
	swp(s2, 4, 6);
	
	return true;
}

bool func2(string s1[7], string s2[7])
{
	string str;
	
	if(!func3(s1, s2)){
		return false;
	}
	rtt(s2);
	if(!func3(s1, s2)){
		return false;
	}
	rtt(s2);
	if(!func3(s1, s2)){
		return false;
	}
	rtt(s2);
	if(!func3(s1, s2)){
		return false;
	}
	rtt(s2);
	
	swp(s2, 3, 4);
	if(!func3(s1, s2)){
		return false;
	}
	swp(s2, 3, 4);
	swp(s2, 2, 5);
	if(!func3(s1, s2)){
		return false;
	}
	swp(s2, 2, 5);
	
	return true;
}

bool func3(string s1[7], string s2[7])
{
	bool f = false;
	for(int i = 1; i <= 6; i++){
		if(s1[i] != s2[i]){
			f = true;
			break;
		}
	}
	
	return f;
}

void rtt(string s[7])
{
	string str;
	str = s[2];
	s[2] = s[3];
	s[3] = s[4];
	s[4] = s[5];
	s[5] = str;
	
	return ;
}

void swp(string s[7], int u, int v)
{
	string str;
	str = s[u];
	s[u] = s[v];
	s[v] = str;
	
	return ;
}

int main()
{
	int n, c;
	string cubes[31][7];
	bool f[31];
	
	while(cin>>n&&n){
		c = 0;
		fill(f, f+31, true);
		for(int i = 0; i < n; i++){
			for(int j = 1; j <= 6; j++){
				cin >> cubes[i][j];
			}
		}
		
		for(int i = 0; i < n; i++){
			for(int j = i+1; j < n && f[i]; j++){
				f[j] = func(cubes[i], cubes[j]);
			}
		}
		
		for(int i = 0; i < n; i++){
			if(f[i]){
				c++;
			}
		}
		cout << n-c << endl;
	}
	
	return 0;
}