#include <iostream>
using namespace std;
class Dice{
public:
	int num[6],t;//t=top
	void North(){
		/*
		dice.num[0] = ???
		dice.num[1] = ???
		dice.num[2] = ???
		dice.num[3] = ???
		dice.num[4] = ???
		dice.num[5] = ???*/
		
		t = num[0];
		num[0] = num[1];//??????1?????¨???
		num[1] = num[5];//??????2?????¨???
		num[5] = num[4];//??????6?????¨???
		num[4] = t;//??????5?????¨???
		}

	void East(){
		t = num[0];
		num[0] = num[3];//??????1?????¨???
		num[3] = num[5];//??????4?????¨???
		num[5] = num[2];//??????6?????¨???
		num[2] = t;//??????3?????¨???
		}

	void West(){
		t = num[0];
		num[0] = num[2];//??????1?????¨???
		num[2] = num[5];//??????5?????¨???
		num[5] = num[3];//??????6?????¨???
		num[3] = t;//??????2?????¨???
		}
		
	void South(){
		t = num[0];
		num[0] = num[4];//??????1?????¨???
		num[4] = num[5];//??????3?????¨???
		num[5] = num[1];//??????6?????¨???
		num[1] = t;//??????3?????¨???
		}
	
	void Rotation(){//?????¢??????????????§?????¢???????????¨???
		t = num[1];
		num[1] = num[2];//?????¢???2?????¨???
		num[2] = num[4];//?????¢???3?????¨???
		num[4] = num[3];//?????¢???5?????¨???
		num[3] = t;//?????¢???4?????¨???
		}
};






int main()
{
	
	Dice d[100];//2<=n<=100
	int n;
	
	cin >>n;

	for(int i=0; i<n; i++){//dice
		cin >> d[i].num[0] >> d[i].num[1] >> d[i].num[2] >> d[i].num[3] >> d[i].num[4] >> d[i].num[5];
	}
		
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++){
			if(i == j)continue;
			
			for(int k=0; k<6; k++){//dice?????°???
				if (k == 4){
					d[i].East();
				}
				if(k == 5){//dice?????°?????¨????????????
					d[i].East();
					d[i].East();
				}
				
				for(int l=0; l<4; l++){//dice?????°??????4???????????????????????????Rotation
					d[i].Rotation();
					//?????????????????????????????´??????No
					if( d[i].num[0] == d[j].num[0] &&
						d[i].num[1] == d[j].num[1] &&
						d[i].num[2] == d[j].num[2] &&
						d[i].num[3] == d[j].num[3] &&
						d[i].num[4] == d[j].num[4] &&
						d[i].num[5] == d[j].num[5] )
					{cout << "No" << endl;
						return 0;
					}
					
				}
			}
		}
	}
	cout << "Yes" << endl;
	return 0;
}
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<functional>
#include<vector>
#include<queue>
using namespace std;
#define f(i,n) for(int i=0;i<(int)n;i++)
#define MOD 1000000009
struct dice{
	int up;
	int down;
	int east;
	int west;
	int north;
	int south;
};
dice a, b;
dice d[100];
char s[101]="NNNNENWNNNNENWNNNNENWNNNNENWENNNNWWNNNNE";
int x;
dice  input(){
	dice c;
	scanf("%d", &x);
	c.up = x;
	scanf("%d", &x);
	c.south = x;
	scanf("%d", &x);
	c.east = x;
	scanf("%d", &x);
	c.west = x;
	scanf("%d", &x);
	c.north = x;
	scanf("%d", &x);
	c.down = x;
	return c;
}
void nr(){
			x = a.north;
			a.north = a.up;
			a.up = a.south;
			a.south = a.down;
			a.down = x;
			return;
}
void sr(){
			x = a.south;
			a.south = a.up;
			a.up = a.north;
			a.north = a.down;
			a.down = x;
			return;
}
void er(){
	x = a.east;
	a.east = a.up;
	a.up = a.west;
	a.west = a.down;
	a.down = x;
	return;
}
void wr(){
	x = a.west;
	a.west = a.up;
	a.up = a.east;
	a.east = a.down;
	a.down = x;
	return;
}
bool comp(){
	if (a.up == b.up&&a.north == b.north&&a.east == b.east&&a.down == b.down&&a.south == b.south&&a.west == b.west)return true;
	else return false;
}
int main(void){
	int n,m;
	scanf("%d", &m);
	f(i, m)d[i] = input();
	n = strlen(s);
	bool ans = false;
	for (int j = 0; j < m; j++){
		for (int k = j + 1; k < m; k++){
	a = d[j];
	b = d[k];
f(i, n){
		if (s[i] == 'N'){
			nr();
		}
		else if (s[i] == 'S'){
			sr();
		}
		else if (s[i] == 'E'){
			er();
		}
		else if (s[i] == 'W'){
			wr();
		}
		ans = comp();
		if (ans == true)break;
	}
if (ans == true)break;
		}
if (ans == true)break;
	}
		if(ans==true)printf("No\n");
		else printf("Yes\n");

	return 0;
}