#include <bits/stdc++.h>
using namespace std;
using namespace chrono;
const int N = 2000;
int A[N][N];
int pref[N];
int n, m, ans = 1e9;
void rec(int i, int l) {
if (i == n) {
int mnIOI = 1e9, mxIOI = 0;
int mnJOI = 1e9, mxJOI = 0;
for (int r = 0; r < n; r++) {
if (0 < pref[r]) {
mnIOI = min(mnIOI, *min_element(A[r], A[r] + pref[r]));
mxIOI = max(mxIOI, *max_element(A[r], A[r] + pref[r]));
}
if (pref[r] < m) {
mnJOI = min(mnJOI, *min_element(A[r] + pref[r], A[r] + m));
mxJOI = max(mxJOI, *max_element(A[r] + pref[r], A[r] + m));
}
}
// for (int i = 0; i < n; i++) cout << pref[i] << " ";
// cout << "\n";
// cout<<mnIOI<<" "<<mxIOI<<" "<<mnJOI<<" "<<mxJOI<<"\n";
if (mnIOI > mxIOI || mnJOI > mxJOI) return;
ans = min(ans, max(mxIOI - mnIOI, mxJOI - mnJOI));
return;
}
for (int x = l; x <= m; x++) {
pref[i] = x;
rec(i+1, x);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < n; i++) for (int j = 0; j < m; cin >> A[i][j++]);
for (int it = 0; it < 2; it++) {
rec(0, 0);
for (int i = 0; i < n; i++)
reverse(A[i], A[i] + m);
}
cout << ans;
}