package main
import (
"bufio"
"fmt"
"os"
)
func gcd(a, b int64) int64 {
if a < 0 {
a = -a
}
if b < 0 {
b = -b
}
for b != 0 {
a, b = b, a%b
}
return a
}
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
var n, m int
if _, err := fmt.Fscan(in, &n, &m); err != nil {
return
}
w := make([][]int64, n)
var mx int64
for i := 0; i < n; i++ {
w[i] = make([]int64, m)
for j := 0; j < m; j++ {
fmt.Fscan(in, &w[i][j])
if w[i][j] > mx {
mx = w[i][j]
}
}
}
base := w[0][0]
var g int64
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
d := w[i][0] + w[0][j] - base - w[i][j]
g = gcd(g, d)
}
}
var k int64
if g == 0 {
k = mx + 1
} else {
if g <= mx {
fmt.Fprintln(out, "NO")
return
}
k = g
}
a := make([]int64, n)
b := make([]int64, m)
for j := 0; j < m; j++ {
b[j] = w[0][j]
}
for i := 0; i < n; i++ {
x := (w[i][0] - base) % k
if x < 0 {
x += k
}
a[i] = x
}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if (a[i]+b[j])%k != w[i][j] {
fmt.Fprintln(out, "NO")
return
}
}
}
for i := 0; i < n; i++ {
if a[i] == 0 {
a[i] = k
}
}
for j := 0; j < m; j++ {
if b[j] == 0 {
b[j] = k
}
}
fmt.Fprintln(out, "YES")
fmt.Fprintln(out, k)
for i := 0; i < n; i++ {
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, a[i])
}
fmt.Fprintln(out)
for j := 0; j < m; j++ {
if j > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, b[j])
}
fmt.Fprintln(out)
}