#include <bits/stdc++.h>
using namespace std;
const string problemName = "";
const string inputFile = problemName + ".in";
const string outputFile = problemName + ".out";
const int INF = (1LL << 31) - 1;
const long long int LINF = (1LL << 62) - 1;
const int dx[] = {1, 0, -1, 0, 1, -1, 1, -1};
const int dy[] = {0, 1, 0, -1, 1, -1, -1, 1};
const int MOD = (int)(1e9) + 7;
const int NMAX = 100000 + 5;
const int MMAX = 100000 + 5;
const int KMAX = 100000 + 5;
const int PMAX = 100000 + 5;
const int LMAX = 100000 + 5;
const int VMAX = 100000 + 5;
long long int N, M, vmax, Ksol;
long long int W[105][105];
long long int A[105];
long long int B[105];
set<long long int> K;
int main() {
  long long int i, j, x, ok = 1;
  scanf("%lld%lld", &N, &M);
  for (i = 1; i <= N; i++)
    for (j = 1; j <= M; j++) {
      scanf("%lld", &W[i][j]);
      vmax = max(vmax, W[i][j]);
    }
  for (i = 1; i <= M; i++) B[i] = W[1][i];
  for (i = 1; i <= N; i++) A[i] = W[i][1] - B[1];
  for (i = 2; i <= N; i++) {
    set<long long int> AA, BB;
    for (j = 1; j <= M; j++) {
      x = W[i][j] - B[j];
      if (x < 0)
        AA.insert(x);
      else
        BB.insert(x);
    }
    if (AA.size() == 1 && BB.size() == 1)
      K.insert(*BB.begin() - *AA.begin());
    else if (AA.size() > 1 || BB.size() > 1)
      ok = 0;
  }
  if (K.size() == 0)
    Ksol = vmax + 1;
  else if (K.size() == 1)
    Ksol = *K.begin();
  if (Ksol <= vmax) ok = 0;
  if (ok) {
    printf("YES\n");
    printf("%lld\n", Ksol);
    for (i = 1; i <= N; i++) printf("%lld ", (A[i] + Ksol) % Ksol);
    printf("\n");
    for (i = 1; i <= M; i++) printf("%lld ", B[i]);
    printf("\n");
  } else
    printf("NO\n");
  return 0;
}
