#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[1010][1010];
bool got[1010][1010];
bool ok(int x) {
  memset(got, 0, sizeof(got));
  for (int j = 0; j < m; j++) {
    vector<int> vt;
    for (int i = 0; i < n; i++)
      if (a[i][j] >= x) vt.push_back(i);
    for (int o = 0; o < vt.size(); o++)
      for (int p = o + 1; p < vt.size(); p++)
        if (got[vt[o]][vt[p]])
          return true;
        else
          got[vt[o]][vt[p]] = true;
  }
  return false;
}
int t[1000010];
int main() {
  int cnt = 0;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      scanf("%d", &a[i][j]);
      t[cnt++] = a[i][j];
    }
  sort(t, t + n * m);
  int l = 0, r = unique(t, t + n * m) - t - 1;
  while (l < r) {
    int m = (l + r + 1) >> 1;
    if (ok(t[m]))
      l = m;
    else
      r = m - 1;
  }
  printf("%d\n", t[l]);
  return 0;
}
