#include using namespace std; int dp[1515][1515]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N,M; cin >> N >> M; vector>D(N,vector(M)); for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { cin >> D[i][j]; } sort(D[i].begin(),D[i].end()); } int l = -1,r = 1001001001; while(l+1 < r) { int mid = (l+r)/2; for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { dp[i][j] = 0; if(i == 0) dp[i][j] = 1; } } for(int i = 0; i+1 < N; i++) { for(int j = 0; j < M; j++) { if(dp[i][j] != 0) { int it1 = lower_bound(D[i+1].begin(),D[i+1].end(),D[i][j])-D[i+1].begin(); int it2 = upper_bound(D[i+1].begin(),D[i+1].end(),D[i][j]+mid)-D[i+1].begin(); dp[i+1][it1]++; dp[i+1][it2]--; } } for(int j = 0; j < M; j++) { dp[i+1][j+1] += dp[i+1][j]; } } bool f = false; for(int i = 0; i < M; i++) { if(dp[N-1][i]) { f = true; } } if(f) r = mid; else l = mid; } cout << ((r == 1001001001)?-1:r) << endl; }