#include #define rep(i, n) for (int i = 0; i < n; ++i) typedef long long ll; using namespace std; const int INF = 2e9; int main() { cin.tie(0)->sync_with_stdio(0); int N, M; cin >> N >> M; vector D(N, vector(M + 1, INF)); rep(i, N) rep(j, M) cin >> D[i][j]; rep(i, N) sort(D[i].begin(), D[i].end()); auto f = [&](int i) -> int { if (i >= M) return INF; int mi = D[0][i]; int cur = mi; for (int j = 1; j < N; ++j) { cur = *lower_bound(D[j].begin(), D[j].end(), cur); } if (cur == INF) return INF; return cur - mi; }; ll l = 0, r = M; while (r - l > 2) { ll c1 = (l * 2 + r) / 3; ll c2 = (l + r * 2) / 3; if (f(c1) > f(c2)) l = c1; else r = c2; } int ans = min({f(l), f(l + 1), f(l + 2)}); if (ans == INF) ans = -1; cout << ans << "\n"; return 0; }