using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ITP1_11_D
{
    class Program
    {
        static void Main(string[] args)
        {
            DiceCast dicecast = new DiceCast();
            DicesJudge dicesJudge = new DicesJudge();
            // 1行目：サイコロの個数n
            // 2～n+1行目：各サイコロの面の整数
            // 入力されたサイコロがすべて異なる場合はYes,1組以上同じものが含まれる場合Noを出力するプログラム

            int n = int.Parse(Console.ReadLine());                                          // 1行目の取得
            int[,] dices = new int[n, 6];                                                   // サイコロの目をn行6列の2次元配列として宣言
            var judge = new List<string>();                                                 // 判定の初期化
            int count = 0;                                                                  // 同一面のカウント数の初期化

            // サイコロの目をそれぞれdice[j]とし、dice[0～5]をdices配列に格納
            for (int i = 0; i < n; i++)
            {
                int[] dice = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

                for (int j = 0; j < 6; j++)
                {
                    dices[i, j] = dice[j];                                                  // i(n)行分の配列をつくる
                }
            }

            // dicesから2つを選び一方を固定。もう一方のdicesの上面の値が等しくなるように回転させる
            for (int j = 0; j < n; j++)
            {
                for (int k = j + 1; k < n; k++)    // 2回のループでdicesの総当たりを記述
                {
                    dicecast.searchTop(dices, j, k);
                }
            }

            // diceが同じものかどうかの判定を行う
            for (int j = 0; j < n; j++)
            {
                for (int k = j + 1; k < n; k++)
                {
                    dicesJudge.SameJudge(dices, j, k, judge, count);
                }
            }

            // 結果を出力する
            if (judge.Contains("No"))
            {
                Console.WriteLine("No");
            }
            else
            {
                Console.WriteLine("Yes");
            }
        }
        public class DiceCast                                                                       // サイコロを回転させる処理を記述したメソッドがあるクラス
        {
            public void searchTop(int[,] dices, int j, int k)                                       // サイコロの上面が等しくなるように回転させるメソッド
            {
                for (int i = 0; i < 4; i++)
                {
                    if (dices[j, 0] != dices[k, 0])
                    {
                        axisX(dices, k);
                    }
                    if (dices[j, 0] != dices[k, 0])
                    {
                        axisZ(dices, k);
                    }
                }
            }
            public void axisX(int[,] dices, int k)                                                  // X軸を軸として回転させるメソッド
            {
                int roll0 = dices[k, 0];
                dices[k, 0] = dices[k, 1];
                dices[k, 1] = dices[k, 5];
                dices[k, 5] = dices[k, 4];
                dices[k, 4] = roll0;
            }
            public void axizY(int[,] dices, int k)                                                  // Y軸を軸として回転させるメソッド
            {
                int roll1 = dices[k, 1];
                dices[k, 1] = dices[k, 2];
                dices[k, 2] = dices[k, 4];
                dices[k, 4] = dices[k, 3];
                dices[k, 3] = roll1;
            }
            public void axisZ(int[,] dices, int k)                                                  // Z軸を軸として回転させるメソッド
            {
                int roll0 = dices[k, 0];
                dices[k, 0] = dices[k, 3];
                dices[k, 3] = dices[k, 5];
                dices[k, 5] = dices[k, 2];
                dices[k, 2] = roll0;
            }
        }

        public class DicesJudge
        {
            DiceCast dicecast = new DiceCast();
            TryCoincide tryCoincide = new TryCoincide();

            public void SameJudge(int[,] dices, int j, int k, List<string> judge, int count)
            {
                if (dices[j, 0] == dices[k, 0] && dices[j, 5] == dices[k, 5])                           // 上底面が一致するとき
                {
                    searchSameSide(dices, j, k, judge);
                }
                else if (dices[j, 0] == dices[k, 0])                                                    // 上面のみが一致するとき
                {
                    sameFiveSide(count, dices, k, judge);
                }
                else                                                                                    // 上底面が一致しないとき
                {
                    judge.Add("Yes");
                }
            }
            public void searchSameSide(int[,] dices, int j, int k, List<string> judge)                  // 側面方向に回転させ、すべての配列が一致する形があるか判定するメソッド
            {
                for (int i = 0; i < 4; i++)
                {
                    dicecast.axizY(dices, k);

                    if (dices[k, 1] == dices[j, 1] && dices[k, 2] == dices[j, 2] && dices[k, 3] == dices[j, 3] && dices[k, 4] == dices[j, 4])
                    {
                        judge.Add("No");
                        break;
                    }
                    else
                    {
                        judge.Add("Yes");
                    }
                }
            }
            public void sameFiveSide(int count, int[,] dices, int k, List<string> judge)                // 5つの面が同じサイコロであるかどうかを判定するメソッド
            {
                count = tryCoincide.countSameFaces(dices, k, count);

                if (count >= 4)
                {
                    judge.Add("No");
                }
                else
                {
                    judge.Add("Yes");
                }
            }
        }

        public class TryCoincide                                                                        // 一致する面があるか調べるメソッドがあるクラス
        {
            public int countSameFaces(int[,] dices, int k, int count)                                   // 上面[0]と等しい面がいくつあるかを数えるメソッド
            {
                for (int i = 1; i < 6; i++)
                {
                    if (dices[k, i] == dices[k, 0])
                    {
                        count++;
                    }
                }
                return count;
            }
        }
    }
}



Measured memory_bytes: 18144