using System;
using System.Collections.Generic;

public class Program
{
    
    public static void Main()
    {
        //サイコロの個数を入力
        int countDice = int.Parse(Console.ReadLine());

        //サイコロを入れるList生成
        List<int[]> listDice = new List<int[]>();

        //サイコロの個数分　サイコロの目を入力
        for (int i = 0; i < countDice; i++)
        {
            //サイコロの目入力
            string[] aryStrDice = Console.ReadLine().Split(' ');

            //数値配列を新しく生成
            int[] aryIntDice = new int[6];

            //入力されたサイコロの目を新しく生成した数値配列に置き換え
            for (int j = 0; j < 6; j++)
            {
                aryIntDice[j] = int.Parse(aryStrDice[j]);
            }
            
            //int[]をListに追加
            listDice.Add(aryIntDice);

        }

        //比較するサイコロどおしが同じかの個数
        int matchCount = 0;

        //サイコロの個数文繰り返す
        for (int i = 0; i < countDice; i++)
        {
            //サイコロの個数分繰り返す
            for (int j = 0; j < countDice; j++)
            {
                //同じサイコロを比較しない
                if (i != j)
                {
                    //Diceクラスインスタンス生成
                    Dice insDice = new Dice(listDice[i], listDice[j]);

                    // サイコロを動かすメソッド 比較するサイコロが一致したら
                    if (insDice.rollDice())
                    {
                        // matchCount を 1 増やす
                        matchCount++;
                    }
                    
                }
            }
        }

        //サイコロすべてが一致しないなら Yes
        //サイコロのどれかでも一致していたら No
        if (matchCount == 0)
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}

class Dice
{

    private int[] aryIntDice1;
    private int[] aryIntDice2;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="aryIntDice1">数値配列　サイコロ１</param>
    /// <param name="aryIntDice2">数値配列　サイコロ２</param>
    public Dice(int[] aryIntDice1, int[] aryIntDice2)
    {
        this.aryIntDice1 = aryIntDice1;
        this.aryIntDice2 = aryIntDice2;
    }

    /// <summary>
    /// サイコロ１を動かしてすべての目があっているか判断
    /// </summary>
    /// <returns>bool</returns>
    public bool rollDice()
    {
        //E方向,N方向に4回ずつ動かしたいので 2回繰り返す
        for (int x = 0; x < 2; x++)
        {
            // E,N方向に4回動かす
            for (int i = 0; i < 4; i++)
            {
                //サイコロどうしが同じか判断
                if (this.checkAllDice())
                {
                    return true;
                }

                // x が0の間 E 方向に動かす
                if (x == 0)
                {
                    this.runOperationE();
                }
                // x が0以外の間 N 方向に動かす
                else
                {
                    this.runOperationN();
                }

                // サイコロを4回右回転させる
                for (int j = 0; j < 4; j++)
                {
                    //サイコロどうしが同じか判断
                    if (this.checkAllDice())
                    {
                        return true;
                    }

                    //右回転させる
                    this.runOperationR();

                }

            }
        }
        return false;
    }

    /// <summary>
    /// サイコロ１とサイコロ２のすべての目が同じか判断
    /// </summary>
    /// <returns>bool</returns>
    private bool checkAllDice()
    {
        if (aryIntDice1[0] == aryIntDice2[0] && aryIntDice1[1] == aryIntDice2[1] &&
             aryIntDice1[2] == aryIntDice2[2] && aryIntDice1[3] == aryIntDice2[3] &&
                aryIntDice1[4] == aryIntDice2[4] && aryIntDice1[5] == aryIntDice2[5])
        {
            return true;
        }
        return false;
    }

    /// <summary>
    /// サイコロを命令に従って動かす E方向
    /// 動いた際のサイコロの動きを配列内の
    /// 数値の入れ替えで再現
    /// </summary>
    private void runOperationE()
    {
        int tmpStorage = aryIntDice1[0];
        aryIntDice1[0] = aryIntDice1[3];
        aryIntDice1[3] = aryIntDice1[5];
        aryIntDice1[5] = aryIntDice1[2];
        aryIntDice1[2] = tmpStorage;
    }
    /// <summary>
    /// サイコロを命令に従って動かす N方向
    /// 動いた際のサイコロの動きを配列内の
    /// 数値の入れ替えで再現
    /// </summary>
    private void runOperationN()
    {
        int tmpStorage = aryIntDice1[0];
        aryIntDice1[0] = aryIntDice1[1];
        aryIntDice1[1] = aryIntDice1[5];
        aryIntDice1[5] = aryIntDice1[4];
        aryIntDice1[4] = tmpStorage;
    }
    /// <summary>
    /// サイコロを命令に従って動かす S方向
    /// 動いた際のサイコロの動きを配列内の
    /// 数値の入れ替えで再現
    /// </summary>
    private void runOperationS()
    {
        int tmpStorage = aryIntDice1[0];
        aryIntDice1[0] = aryIntDice1[4];
        aryIntDice1[4] = aryIntDice1[5];
        aryIntDice1[5] = aryIntDice1[1];
        aryIntDice1[1] = tmpStorage;
    }
    /// <summary>
    /// サイコロを命令に従って動かす W方向
    /// 動いた際のサイコロの動きを配列内の
    /// 数値の入れ替えで再現
    /// </summary>
    private void runOperationW()
    {
        int tmpStorage = aryIntDice1[0];
        aryIntDice1[0] = aryIntDice1[2];
        aryIntDice1[2] = aryIntDice1[5];
        aryIntDice1[5] = aryIntDice1[3];
        aryIntDice1[3] = tmpStorage;
    }

    /// <summary>
    /// サイコロを命令に従って動かす 右ロール
    /// 動いた際のサイコロの動きを配列内の
    /// 数値の入れ替えで再現
    /// </summary>
    private void runOperationR()
    {
        int tmpStorage = aryIntDice1[1];
        aryIntDice1[1] = aryIntDice1[2];
        aryIntDice1[2] = aryIntDice1[4];
        aryIntDice1[4] = aryIntDice1[3];
        aryIntDice1[3] = tmpStorage;
    }
}

Measured memory_bytes: 9260