#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1000000000")
using namespace std;
const int maxn = 110;
long long v[maxn][maxn];
long long a[maxn];
long long b[maxn];
long long gcd(long long a, long long b) {
  if (b == 0) {
    return a;
  }
  return gcd(b, a % b);
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%lld", &v[i][j]);
    }
  }
  long long now = 0;
  for (int j = 1; j <= m - 1; j++) {
    vector<long long> g;
    for (int i = 1; i <= n; i++) {
      g.push_back(v[i][j + 1] - v[i][j]);
    }
    for (int k = 0; k < (int)g.size(); k++) {
      for (int t = k + 1; t < (int)g.size(); t++) {
        now = gcd(now, abs(g[k] - g[t]));
      }
    }
  }
  for (int i = 1; i <= n - 1; i++) {
    vector<long long> g;
    for (int j = 1; j <= m; j++) {
      g.push_back(v[i + 1][j] - v[i][j]);
    }
    for (int k = 0; k < (int)g.size(); k++) {
      for (int t = k + 1; t < (int)g.size(); t++) {
        now = gcd(now, abs(g[k] - g[t]));
      }
    }
  }
  if (now == 0) {
    now = (int)1e9 + 7;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (v[i][j] >= now) {
        printf("NO\n");
        return 0;
      }
    }
  }
  printf("YES\n");
  printf("%lld\n", now);
  a[1] = 0;
  b[1] = v[1][1];
  for (int i = 2; i <= n; i++) {
    a[i] = a[i - 1] + v[i][1] - v[i - 1][1];
    a[i] %= now;
    a[i] += now;
    a[i] %= now;
  }
  for (int j = 2; j <= m; j++) {
    b[j] = b[j - 1] + v[1][j] - v[1][j - 1];
    b[j] %= now;
    b[j] += now;
    b[j] %= now;
  }
  for (int i = 1; i <= n; i++) {
    printf("%lld ", a[i]);
  }
  printf("\n");
  for (int i = 1; i <= m; i++) {
    printf("%lld ", b[i]);
  }
  return 0;
}
