#include using namespace std; using ll = long long; using ull = unsigned long long; using vi = vector; using vvi = vector>; using vll = vector; using vvll = vector; using pi = pair; using vpi = vector; void solve() { int n, d; cin >> n >> d; vvll a(n, vll(d)); for (auto& x : a) for (auto& y : x) cin >> y; int good = -1; for (int i = 0; i < d; ++i) { for (int j = 1; j < n; ++j) { if (a[j][i] != a[0][i]) { good = i; break; } } } if (good == -1) { cout << 0 << endl; return; } for (auto& x : a) rotate(x.begin(), x.begin() + good, x.end()); sort(a.begin(), a.end()); vll diff(d); ll gcd = 0; for (int i = 0; i < d; ++i) { diff[i] = a[n-1][i] - a[0][i]; gcd = __gcd(gcd, diff[i]); } assert(gcd != 0); for (auto& x : diff) x /= gcd; bool ok = true; for (int i = 1; i < n && ok; ++i) { ll g = 0; for (int j = 0; j < d; ++j) { ll f = a[i][j] - a[i-1][j]; if (diff[j] != 0 && f % diff[j] != 0) { ok = false; break; } if (g != 0 && g * diff[j] != f) { ok = false; break; } if (f != 0 && diff[j] == 0) { ok = false; break; } if (g == 0 && diff[j] != 0) { g = f / diff[j]; } } } if (!ok) { cout << -1 << endl; return; } const auto& mid = a[n / 2]; vll dsts(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < d; ++j) { dsts[i] += abs(a[i][j] - mid[j]); } } ll best = 1e18+5; for (int i = 0; i < d; ++i) { ll ans = 0; for (int j = 0; j < n; ++j) { ll dst = dsts[j] - abs(a[j][i] - mid[i]); ans += dst * 2; } best = min(best, ans); } cout << best << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; //cin >> t; while (t--) { solve(); } return 0; }