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

using namespace std;

struct Dice
{
  int c[6];
  void rot(int type){
    char newc[6];
    if( type == 0 ){ // front
      newc[2]=c[2];newc[3]=c[3];
      newc[0]=c[1];newc[1]=c[5];newc[4]=c[0];newc[5]=c[4];
    }
    if( type == 1 ){ // right
      newc[1]=c[1];newc[4]=c[4];
      newc[0]=c[3];newc[2]=c[0];newc[3]=c[5];newc[5]=c[2];
    }
    if( type == 2 ){ // hor
      newc[0]=c[0];newc[5]=c[5];
      newc[1]=c[2];newc[2]=c[4];newc[3]=c[1];newc[4]=c[3];
    }
    for(int i = 0; i < 6; ++i)c[i]=newc[i];
  }
  bool samePattern(Dice d)const{
    const int rots[] = {0,0,0,1,1,1, 1};
    for(int i = 0; i < sizeof(rots)/sizeof(*rots);++i){
      for(int j = 0; j < 4; ++j){
	if( same(d) ) return true;
	d.rot(2);
      }
      d.rot( rots[i] );
    }
    return false;
  }
  bool same(const Dice &d)const{
    for(int i = 0; i < 6; ++i){
      if( c[i] != d.c[i] ) return false;
    }
    return true;
  }
};
int main()
{
  while(true){
    int n;
    int ans = 0;
    cin >> n;
    if( n == 0 )break;
    Dice dice[n];
    bool inv[n];
    fill(inv,inv+n,false);
    for(int i = 0; i < n; ++i){
      for(int j = 0; j < 6; ++j){
	string s;
	cin >> s;
	if( s == "Cyan" )    dice[i].c[j]=0;
	if( s == "Yellow" )  dice[i].c[j]=1;
	if( s == "Red" )     dice[i].c[j]=2;
	if( s == "Magenta" ) dice[i].c[j]=3;
	if( s == "Green" )   dice[i].c[j]=4;
	if( s == "Blue" )    dice[i].c[j]=5;
      }
    }
   

    for(int i = 0; i < n; ++i){
      if( !inv[i] ){
	for(int j = i+1; j < n; ++j){
	  if( !inv[j] ){
	    if( dice[i].samePattern( dice[j] ) ){
	      inv[j]=true;
	    }
	  }
	}
      }
    }
    for(int i = 0; i < n; ++i){
      if( inv[i] ){
	++ans;
      }
    }
    cout << ans << endl;
  }
  return 0;
}