bool debug=false;
#include <vector>
#include <iostream>
#include <map>
using namespace std;
#define PB push_back
map<string,int> m;
int t=1;
struct cube{
	int s[6];
	void in(){
		string temp;
		for(int i=0;i<6;i++){
			cin>>temp;
			if(m.find(temp)==m.end())s[i]=m[temp]=t++;
			else s[i]=m[temp];
		}
	}
	void out(){
		if(debug){
			for(int i=0;i<6;i++)cout<<s[i]<<" ";
			cout<<endl;
		}
	}
	bool operator ==(const cube &a){for(int i=0;i<6;i++)if(s[i]!=a.s[i])return false;return true;}
};
cube Arotate(cube c){
	cube temp;
	temp.s[0]=c.s[3];
	temp.s[1]=c.s[1];
	temp.s[2]=c.s[0];
	temp.s[3]=c.s[5];
	temp.s[4]=c.s[4];
	temp.s[5]=c.s[2];
	if(debug)temp.out();
	return temp;
}
cube Brotate(cube c){
	cube temp;
	temp.s[0]=c.s[0];
	temp.s[1]=c.s[3];
	temp.s[2]=c.s[1];
	temp.s[3]=c.s[4];
	temp.s[4]=c.s[2];
	temp.s[5]=c.s[5];
	if(debug)temp.out();
	return temp;
}
cube Crotate(cube c){
	cube temp;	
	temp.s[0]=c.s[1];
	temp.s[1]=c.s[5];
	temp.s[2]=c.s[2];
	temp.s[3]=c.s[3];
	temp.s[4]=c.s[0];
	temp.s[5]=c.s[4];
	if(debug)temp.out();
	return temp;
}
void solve(int n){
	bool f;
	vector<cube> v;
	cube temp;
	for(int y=0;y<n;y++){
		temp.in();
		if(v.empty())v.PB(temp);
		else{
			f=true;
			for(int i=0;i<4;i++){
				temp=Arotate(temp);
				for(int j=0;j<4;j++){
					temp=Brotate(temp);
					for(int k=0;k<4;k++){
						temp=Crotate(temp);
						for(cube x:v)if(temp==x)f=false;
					}
				}
			}
			if(f)v.PB(temp);
			if(debug)cout<<"done"<<endl;
		}
	}
	cout<<n-(int)v.size()<<endl;
}
int main(){
	int n;
	while(true){
		cin>>n;
		if(n==0)break;
		solve(n);
	}
}

