```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n, m int
fmt.Fscan(in, &n, &m)
w := make([][]int64, n)
for i := 0; i < n; i++ {
w[i] = make([]int64, m)
for j := 0; j < m; j++ {
fmt.Fscan(in, &w[i][j])
}
}
maxW := int64(0)
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if w[i][j] > maxW {
maxW = w[i][j]
}
}
}
g := int64(0)
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
d := w[i][j] - w[i][0] - w[0][j] + w[0][0]
if d < 0 {
d = -d
}
g = gcd(g, d)
}
}
var k int64
if g == 0 {
k = maxW + 1
} else {
if g <= maxW {
fmt.Fprintln(out, "NO")
return
}
k = g
}
a := make([]int64, n)
for i := 0; i < n; i++ {
a[i] = w[i][0]
}
b := make([]int64, m)
for j := 0; j < m; j++ {
diff := w[0][j] - w[0][0]
if diff >= 0 {
b[j] = diff
} else {
b[j] = diff + 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)
}
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
}
```