#include <iostream>
using namespace std;

class Dice {
	int m_top;
	int m_front;
	int m_right;
	int m_face[6] = { 0 };
public:
	Dice();
	Dice(int face[], int top, int front, int right);
	void DiceInit(int face[]);
	int faceNum(int face) {
		return m_face[face];
	}
	void roll(int news);
	int top() {
		return m_top;
	}
	int bottom() {
		return (5 - m_top);
	}
	int front() {
		return m_front;
	}
	int back() {
		return (5 - m_front);
	}
	int right() {
		return m_right;
	}
	int left() {
		return (5 - m_right);
	}
};

Dice::Dice() {
	m_top = 0;
	m_front = 1;
	m_right = 2;
}

Dice::Dice(int face[], int top, int front, int right) {
	for (int i = 0; i < 6; i++) {
		m_face[i] = face[i];
	}
	m_top = top;
	m_front = front;
	m_right = right;
}

void Dice::DiceInit(int face[])
{
	for (int i = 0; i < 6; i++) {
		m_face[i] = face[i];
	}
}

void Dice::roll(int news) {
	int temp = 0;
	switch (news)
	{
	case 0:		// N
		temp = bottom();
		m_top = m_front;
		m_front = temp;
		break;
	case 1:		// E
		temp = left();
		m_right = m_top;
		m_top = temp;
		break;
	case 2:		// S
		temp = back();
		m_front = m_top;
		m_top = temp;
		break;
	case 3:		// W
		temp = bottom();
		m_top = m_right;
		m_right = temp;
		break;
	default:
		break;
	}
}

bool samedice(Dice &d1, Dice &d2)
{
	if (d1.faceNum(d1.top()) != d2.faceNum(d2.top())) {
		return false;
	}
	else if(d1.faceNum(d1.bottom()) != d2.faceNum(d2.bottom()))
	{
		return false;
	}
	else if (d1.faceNum(d1.front()) != d2.faceNum(d2.front()))
	{
		return false;
	}
	else if (d1.faceNum(d1.back()) != d2.faceNum(d2.back()))
	{
		return false;
	}
	else if (d1.faceNum(d1.right()) != d2.faceNum(d2.right()))
	{
		return false;
	}
	else if (d1.faceNum(d1.left()) != d2.faceNum(d2.left()))
	{
		return false;
	}
	else
	{
		return true;
	}
}

bool perfectmatchdice(Dice d1, Dice d2)
{
	bool same = false;
	d2.roll(2);	// frontが1
	for (int i = 0; i < 4; i++) {
		if (samedice(d1,d2)) {
			same = true;
			goto Label_Result;
		}
		else
		{
			d2.roll(1);
		}
	}

	d2.roll(0);	// frontが2
	for (int i = 0; i < 4; i++) {
		if (samedice(d1,d2)) {
			same = true;
			goto Label_Result;
		}
		else
		{
			d2.roll(1);
		}
	}

	d2.roll(3);
	d2.roll(2);	// frontが3
	for (int i = 0; i < 4; i++) {
		if (samedice(d1,d2)) {
			same = true;
			goto Label_Result;
		}
		else
		{
			d2.roll(1);
		}
	}

	d2.roll(0);
	d2.roll(0);	// frontが4
	for (int i = 0; i < 4; i++) {
		if (samedice(d1,d2)) {
			same = true;
			goto Label_Result;
		}
		else
		{
			d2.roll(1);
		}
	}

	d2.roll(0);	// frontが5
	for (int i = 0; i < 4; i++) {
		if (samedice(d1,d2)) {
			same = true;
			goto Label_Result;
		}
		else
		{
			d2.roll(1);
		}
	}

	d2.roll(3);
	d2.roll(2);	// frontが6
	for (int i = 0; i < 4; i++) {
		if (samedice(d1,d2)) {
			same = true;
			goto Label_Result;
		}
		else
		{
			d2.roll(1);
		}
	}

Label_Result:
	return same;
}

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

	for (int i = 0; i < n; i++) {
		int f[6] = { 0 };
		for (int j = 0; j < 6; j++) {
			cin >> f[j];
		}
		d[i].DiceInit(f);
	}
	
	bool res = false;
	for (int i = 0; i < (n - 1); i++) {
		for (int j = i + 1; j < n; j++) {
			if (perfectmatchdice(d[i], d[j])) {
				res = true;
				break;
			}
		}
	}

	cout << (!res ? "Yes" : "No") << endl;

	return 0;
}


Measured memory_bytes: 3136