#include <bits/stdc++.h>
using namespace std;
int n, m;
int matrix[20][20];
int columnChanges = 0;
bool SwapMatrixElements(int string);
void Swap(int x1, int y1, int x2, int y2);
void SwapMatrixColumns(int column1, int column2);
bool CheckStringSorted(int string);
bool SwapMatrixElements(int string) {
  for (int i = 0; i < m - 1; i++) {
    for (int j = i + 1; j < m; j++) {
      Swap(string, i, string, j);
      if (CheckStringSorted(string)) {
        Swap(string, i, string, j);
        return true;
      }
      Swap(string, i, string, j);
    }
  }
  return false;
}
void SwapMatrixColumns(int column1, int column2) {
  for (int i = 0; i < n; i++) {
    Swap(i, column1, i, column2);
  }
  columnChanges++;
}
void Swap(int x1, int y1, int x2, int y2) {
  int temp = matrix[x1][y1];
  matrix[x1][y1] = matrix[x2][y2];
  matrix[x2][y2] = temp;
}
bool CheckStringSorted(int string) {
  for (int j = 0; j < m - 1; j++) {
    if (matrix[string][j] > matrix[string][j + 1]) return false;
  }
  return true;
}
int main() {
  bool test = false;
  int count = 0;
  char* result = "NO";
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> matrix[i][j];
    }
  }
  for (int i = 0; i < n; i++) {
    if (!CheckStringSorted(i)) {
      if (!SwapMatrixElements(i)) {
        test = true;
        break;
      }
    }
  }
  if (test) {
    for (int i = 0; i < m - 1; i++) {
      for (int j = i + 1; j < m; j++) {
        SwapMatrixColumns(i, j);
        for (int k = 0; k < n; k++) {
          if (!CheckStringSorted(k)) {
            if (!SwapMatrixElements(k)) {
              break;
            }
          }
          count++;
        }
        SwapMatrixColumns(i, j);
        if (count == n) {
          result = "YES";
          break;
          break;
        } else
          count = 0;
      }
    }
  } else
    result = "YES";
  cout << result << endl;
  return 0;
}
