#include<iostream>
#include<cmath>
#include<iomanip>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;

class Dice {
public:
  int a[6];
  Dice(){
    for(int i = 0; i < 6; i++)
      cin >> a[i];
  }
  void Roll(string s){
    int temp;

    for(string::size_type i = 0; i < s.length(); i++){
      if(s[i] == 'E'){
        temp = a[3];
        a[3] = a[5];
        a[5] = a[2];
        a[2] = a[0];
        a[0] = temp;
      }else if(s[i] == 'W'){
        temp = a[2];
        a[2] = a[5];
        a[5] = a[3];
        a[3] = a[0];
        a[0] = temp;
      }
      else if(s[i] == 'S'){
        temp = a[4];
        a[4] = a[5];
        a[5] = a[1];
        a[1] = a[0];
        a[0] = temp;
        // printCurrent();
      }else if(s[i] == 'N'){
        temp = a[1];
        a[1] = a[5];
        a[5] = a[4];
        a[4] = a[0];
        a[0] = temp;
      }
    } 
  }
  int serchNum(int n){
    int i;
    for(i = 0 ; i < 6;i++){
      if(n == a[i]) break;
    }
    return i;
  }
  void set0(int n){
    int index = serchNum(n);
    if(index == 0) return;
    else if(index == 1){
      // index == 1を上面にする
      Roll("N");
    }
    else if(index == 2){
      // index == 2を上面にする
      Roll("W");
    }
    else if(index == 3){
      // index == 3を上面にする
      Roll("E");
    }
    else if(index == 4){
      // index == 4を上面にする
      Roll("S");
    }
    else if(index == 5){
      // index == 5を上面にする
      Roll("WW");
    }
  }
  void printCurrent(){
    cout << "現在の状態" << endl;
    for(int i = 0; i < 6; i++)
      cout << a[i] << endl;
    cout << endl;
  }
  int getRightNumber(int n){
    if(n == a[1]){
      return a[2];
    }else if(n == a[2]){
      return a[4];
    }
    else if(n == a[4]){
      return a[3];
    }
    else if(n == a[3]){
      return a[1];
    }
    return -1;
  }
  void rotate(){
    // サイコロの上面を変えずに左回転

  }

  int compareTowDice(Dice& dice){
    if(a[0] != dice.a[0] || a[5] != dice.a[5]) return -1;
    else{
      // a[1]~a[4]を比較
      int temp;
      for(int k = 0; k < 4; k++){
        if(k != 0){
          temp = dice.a[1];
          dice.a[1] = dice.a[3];
          dice.a[3] = dice.a[4];
          dice.a[4] = dice.a[2];
          dice.a[2] = temp;
        }
        // デバッグ
        // cout << "k = " << k << endl;
        // for(int i = 1; i < 5; i++){
        //   cout << dice.a[i] << " ";
        // }
        // cout << endl;

        for(int i = 1; i <= 4; i++){
          if(a[i] != dice.a[i]) break;
          if(i == 4) return 1;
        }
      }
      // 元に戻す
      temp = dice.a[1];
      dice.a[1] = dice.a[3];
      dice.a[3] = dice.a[4];
      dice.a[4] = dice.a[2];
      dice.a[2] = temp;
      return -1;
    }
  }

  bool operator==(Dice& dice){

    // 全ての面を上にして比較する
    int flag = 0;
    for(int i = 0; i < 6; i++){
      switch(i){
        case 0:
          // 最初は転がさない
          flag = compareTowDice(dice);
          if(flag == 1){
            return true;
          }
          break;
        case 1:
          dice.Roll("E");
          flag = compareTowDice(dice);
          if(flag == 1){
            return true;
          }
          // サイコロを戻す
          dice.Roll("W");
          break;
        case 2:
          dice.Roll("S");
          flag = compareTowDice(dice);
          if(flag == 1){
            return true;
          }
          dice.Roll("N");
          break;
        case 3:
          dice.Roll("N");
          flag = compareTowDice(dice);
          if(flag == 1){
            return true;
          }
          dice.Roll("S");
          break;
        case 4:
          dice.Roll("W");
          // for(int i = 0; i < 6; i++)
          //   cout << dice.a[i] << " ";
          // cout << endl;
          flag = compareTowDice(dice);
          if(flag == 1){
            return true;
          }
          // for(int i = 0; i < 6; i++)
          //   cout << dice.a[i] << " ";
          // cout << endl;
          dice.Roll("E");
          break;
        case 5:
          dice.Roll("WW");
          // cout << dice.a[0] << endl;
          // cout << dice.a[5] << endl;
          // exit(0);
          flag = compareTowDice(dice);
          if(flag == 1){
            return true;
          }
          break;
      }
    }
    return false;
  }
  bool operator!=(Dice& dice){
    return !(a == dice.a);
  }
};

int main(){
  int n;
  cin >> n;
  Dice* dices = new Dice[n];
  for(int i = 0; i < n-1; i++){
    for (int j = i + 1; j < n; j++){
      if(dices[i] == dices[j]){
        cout << "No" << endl;
        exit(0);
      }
    }
  }
  cout << "Yes" << endl;
}


Measured memory_bytes: 3220