#include <iostream>
#include <vector>
#include <cmath> // std::abs()
int main()
{
// H 行, W 列
int H, W;
std::cin >> H >> W;
// 2 次元配列 (大きさ W の vector が H 個)
std::vector<std::vector<int>> A(H, std::vector<int>(W));
for (auto& row : A)
{
for (auto& a : row)
{
std::cin >> a;
}
}
// 2 次元配列 (大きさ W の vector が H 個)
std::vector<std::vector<int>> B(H, std::vector<int>(W));
for (auto& row : B)
{
for (auto& b : row)
{
std::cin >> b;
}
}
// 操作回数の合計
long long count = 0;
for (int y = 0; y < (H - 1); ++y) // 上から y 行目
{
for (int x = 0; x < (W - 1); ++x) // 左から x 列目
{
// 現在注目しているマスの A, B それぞれの値
const int a = A[y][x];
const int b = B[y][x];
// a と b の差
const int diff = (b - a);
// 操作によって現在注目しているマスの A, B それぞれの値を一致させる
A[y][x] += diff;
A[y][x + 1] += diff;
A[y + 1][x] += diff;
A[y + 1][x + 1] += diff;
// 差の絶対値が操作回数
count += std::abs(diff);
}
}
// 一致するか
bool match = true;
// A, B の一番右の列が一致するかを調べる
//
// ----*
// ----*
// ----*
// ----*
// ----*
//
for (int y = 0; y < H; ++y)
{
if (A[y].back() != B[y].back())
{
// 一致しなかった
match = false;
break;
}
}
// A, B の最後の行が一致するかを調べる
//
// -----
// -----
// -----
// -----
// *****
//
if (match && (A.back() == B.back()))
{
std::cout << "Yes\n";
std::cout << count << '\n';
}
else
{
std::cout << "No\n";
}
}