#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if ((a == 0) || (b == 0)) return a + b;
  return gcd(b, a % b);
}
long long pow_mod(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1) res = (res * a) % 1000000007;
    a = (a * a) % 1000000007;
    b >>= 1;
  }
  return res;
}
bool isPrime(long long a) {
  for (int i = 3; (i * i) <= a; i += 2) {
    if ((a % i) == 0) return false;
  }
  if ((a != 2) && ((a % 2) == 0)) return false;
  return true;
}
string con_ll_to_str(int a) {
  stringstream mystr;
  mystr << a;
  return mystr.str();
}
long long con_str_to_ll(string st) {
  long long numb = 0;
  int len = st.size(), i, j = 0;
  for (i = len - 1; i >= 0; i--) {
    numb += (pow_mod(10, j) * (st[i] - '0'));
    j++;
  }
  return numb;
}
long long arr[400][400], mat[400][400];
void swapp(long long i, long long j, long long N) {
  long long k;
  for (k = 1; k <= N; k++) {
    swap(mat[k][i], mat[k][j]);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  long long N, M, i, j, k1, k2;
  string st = "";
  cin >> N >> M;
  for (i = 1; i <= N; i++) {
    for (j = 1; j <= M; j++) {
      cin >> arr[i][j];
      mat[i][j] = arr[i][j];
    }
  }
  for (i = 1; i <= M; i++) {
    for (j = i; j <= M; j++) {
      long long ans = 0, opop;
      swapp(i, j, N);
      for (k1 = 1; k1 <= N; k1++) {
        opop = 0;
        for (k2 = 1; k2 <= M; k2++) {
          if (mat[k1][k2] != k2) opop++;
        }
        if (opop <= 2)
          ans += opop / 2;
        else
          ans += N + 1;
      }
      swapp(j, i, N);
      if (ans <= N) {
        cout << "YES";
        return 0;
      }
    }
  }
  cout << "NO";
  return 0;
}
