#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int H[6][6] = {
	{1,5,2,3,0,4}, // North : 奥へ移動   ( y:-1 )
	{3,1,0,5,4,2}, // East  : 右へ移動   ( x:+1 )
	{2,1,5,0,4,3}, // West  : 左へ移動   ( x:-1 )
	{4,0,2,3,5,1}, // South : 手前へ移動 ( y:+1 )
	{0,2,4,1,3,5}, // Right : 右回りに回転 (移動なし)
	{0,3,1,4,2,5}  // Left  : 左回りに回転 (移動なし)
};

// サイコロライブラリ
// d[0] := top,   d[1] := front 
// d[2] := right, d[3] := left
// d[4] := back,  d[5] := bottom
enum{TOP, FRONT, RIGHT, LEFT, BACK, BOTTOM};
struct Cube{
	vector<string> d;
	// コンストラクタで初期化
	Cube(vector<string> v){
		if( v.size() == 6 ){
			d = v;
		}else{
			d = vector<string>(6);
		}
	}
	Cube(){ d = vector<string>(6); }
	// dirの方向に回転 (副作用なし)
	Cube roll(int dir){
		Cube result = (*this);
		vector<string> d_(6);
		for(int i = 0 ; i < 6 ; i++ ){
			d_[i] = d[ H[dir][i] ];
		}
		result.d = d_;
		return result;
	}
	void debug(){
		for(int i=0 ; i < 6 ; i++ ){
			cout << (*this).d[i] << " ";
		}
		cout << endl;
	}
	bool operator==(const Cube& c){
		for(int i=0 ; i < 6 ; i++ ){
			if( c.d[i] != (*this).d[i] )
				return false;
		}
		return true;
	}
	bool is_same(Cube c){
		Cube c_[24];
		c_[0] = c;
		c_[1] = c.roll(0);
		c_[2] = c.roll(1);
		c_[3] = c.roll(2);
		c_[4] = c.roll(3);
		c_[5] = (c.roll(0)).roll(0);
		
		for(int i=6 ; i < 12 ; i++ ){
			c_[i] = c_[i-6].roll(4);
		}
		for(int i=12 ; i < 18 ; i++ ){
			c_[i] = c_[i-6].roll(4);
		}
		for(int i=18 ; i < 24 ; i++ ){
			c_[i] = c_[i-6].roll(4);
		}
		
		for(int i=0 ; i < 24 ; i++ ){
			if( c_[i] == (*this) )
				return true;
		}
		return false;
	}
};

int main(){
	int n;
	while( cin >> n , n ){
		vector<Cube> v;
		 
		for(int i=0 ; i < n ; i++ ){
			Cube c;
			for(int j=0 ; j < 6 ; j++ ){
				string s;
				cin >> s;
				c.d[j] = s;
			}
			bool flag = true;
			for(int j=0 ; j < v.size() ; j++ ){
				if( c.is_same( v[j] ) ) flag = false;
			}
			
			if( flag ){
				v.push_back( c );
			}
		}
		cout << (n - v.size()) << endl;
	}
}