#include <bits/stdc++.h>
using namespace std;
static void no() {
  cout << "NO\n";
  exit(0);
}
vector<long long> a;
vector<long long> b;
static long long solve(vector<long long> v, vector<long long> last) {
  long long n = v.size();
  if (v[0] == last[0]) {
    for (long long j = 1; j < n; j++) {
      if (v[j] != last[j]) no();
    }
    b.push_back(b.back());
    return 0;
  }
  long long poz = 0, neg = 0;
  for (long long x, i = 0; i < n; i++) {
    x = v[i] - last[i];
    if (x < 0) {
      if (neg == 0)
        neg = x;
      else if (neg != x)
        no();
    } else if (x > 0) {
      if (poz == 0)
        poz = x;
      else if (poz != x)
        no();
    } else
      no();
  }
  if (poz == 0)
    b.push_back(b.back() + neg);
  else {
    b.push_back(b.back() + poz);
    if (neg != 0) return poz - neg;
  }
  return 0;
}
signed main() {
  long long n, m;
  vector<long long> mat[100];
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    mat[i].resize(m);
    for (long long j = 0; j < m; j++) {
      cin >> mat[i][j];
    }
  }
  a = mat[0];
  long long k = 1000000000000000LL;
  b.push_back(0);
  for (long long temp, i = 1; i < n; i++) {
    temp = solve(mat[i], mat[i - 1]);
    if (temp != 0 && k != 1000000000000000LL && k != temp)
      no();
    else if (temp != 0)
      k = temp;
  }
  for (long long j = 0; j < b.size(); j++) {
    b[j] = (b[j] + k) % k;
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      if (mat[i][j] != (a[j] + b[i]) % k) no();
    }
  }
  cout << "YES\n";
  cout << k << '\n';
  for (long long i = 0; i < n; i++) cout << b[i] << ' ';
  cout << '\n';
  for (long long i = 0; i < m; i++) cout << a[i] << ' ';
  cout << '\n';
}
