#include <bits/stdc++.h>
#define _USE_MATH_DEFINES
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define rep(i, n) FOR(i, 0, n)

using namespace std;

class Dice
{
public:
    int label[6], tmp;

    void in()
    {
        rep(i, 6) scanf("%d", &label[i]);
    }

    void rollS()
    {
        tmp = label[0];
        label[0] = label[4];
        label[4] = label[5];
        label[5] = label[1];
        label[1] = tmp;
    }

    void rollN()
    {
        tmp = label[0];
        label[0] = label[1];
        label[1] = label[5];
        label[5] = label[4];
        label[4] = tmp;
    }

    void rollE()
    {
        tmp = label[0];
        label[0] = label[3];
        label[3] = label[5];
        label[5] = label[2];
        label[2] = tmp;
    }

    void rollW()
    {
        tmp = label[0];
        label[0] = label[2];
        label[2] = label[5];
        label[5] = label[3];
        label[3] = tmp;
    }

    void sideturn()
    {
        tmp = label[1];
        label[1] = label[2];
        label[2] = label[4];
        label[4] = label[3];
        label[3] = tmp;
    }
};

bool check2(Dice d1, Dice d2)
{
    bool c = true;
    FOR(i, 1, 5)
    {
        c = c && d1.label[i] == d2.label[i];
    }

    return c;
}

bool check1(Dice d1, Dice d2)
{
    bool b = false;

    if (d1.label[0] == d2.label[0] && d1.label[5] == d2.label[5])
    {
        rep(i, 4)
        {
            b = b || check2(d1, d2);
            d2.sideturn();
        }
    }
    return b;
}

bool isSame(Dice d1, Dice d2)
{
    bool a = false;

    a = a || check1(d1, d2);
    d2.rollN();
    a = a || check1(d1, d2);
    d2.rollE();
    a = a || check1(d1, d2);
    d2.rollE();
    a = a || check1(d1, d2);
    d2.rollE();
    a = a || check1(d1, d2);
    d2.rollN();
    a = a || check1(d1, d2);

    return a;
}

int main()
{
    int n;
    bool ans = false;
    scanf("%d", &n);
    Dice dice[n];
    rep(i, n) dice[i].in();

    rep(i, n)
    {
        FOR(j, i + 1, n)
        {
            ans = ans || isSame(dice[i], dice[j]);
        }
    }

    if (ans)
        printf("No\n");
    else
        printf("Yes\n");
}

#include<iostream>
using namespace std;

struct Directions
{
	int E[6] = { 2, 1, 5, 0, 4, 3 };
	int W[6] = { 3, 1, 0, 5, 4, 2 };
	int N[6] = { 4, 0, 2, 3, 5, 1 };
	int S[6] = { 1, 5, 2, 3, 0, 4 };
	int Rotate[6] = { 0, 2, 4, 1, 3, 5 };
};

class Dice
{
public:
	int num[6];
	void swap(int*);
	Directions dir_array;
	Dice();
	void roll(char);
	void show_num(int);
};

Dice::Dice()
{
	for (int i = 0; i < 6; i++)
		cin >> this->num[i];
}

void Dice::roll(char c)
{
	switch (c)
	{
	case 'E':
		this->swap(dir_array.E);
		break;
	case 'W':
		this->swap(dir_array.W);
		break;
	case 'N':
		this->swap(dir_array.N);
		break;
	case 'S':
		this->swap(dir_array.S);
		break;
	case 'R':
		this->swap(dir_array.Rotate);
		break;
	}
	return;
}

void Dice::swap(int *dir)
{
	int tmp[6];
	for (int i = 0; i < 6; i++)
		tmp[dir[i]] = num[i];
	for (int i = 0; i < 6; i++)
		num[i] = tmp[i];
	return;
}

void Dice::show_num(int i)
{
	cout << this->num[i] << endl;
	return;
}

int check(Dice dice1, Dice dice2)
{
	int tmpf, flag = 0;
	for (int i = 0; i < 4; i++) {
		tmpf = 1;
		for (int j = 0; j < 6; j++)
			if (dice1.num[j] != dice2.num[j])
			{
				tmpf = 0;
				break;
			}
		if (tmpf)
			flag = 1;
		dice2.roll('R');
	}
	return flag;
}
int dice_comp(Dice dice1, Dice dice2)
{
	int flag = 0;
	for (int i = 0; i < 4; i++)
	{
		flag += check(dice1, dice2);
		dice2.roll('E');
	}
	dice2.roll('N');
	flag += check(dice1, dice2);
	dice2.roll('N');
	dice2.roll('N');
	flag += check(dice1, dice2);
	return flag;
}

int main()
{
	int flag = 0, n;
	cin >> n;
	Dice dice1;
	for (int i = 1; i < n; i++)
	{
		Dice dice2;
		flag += dice_comp(dice1, dice2);
	}
	if (!flag)
		cout << "Yes" << endl;
	else
		cout << "No" << endl;

	return 0;
}
