#include <bits/stdc++.h>
using namespace std;
bool possible(int ans, vector<vector<int> >& rect) {
  vector<vector<int> > good(int((rect[0]).size()),
                            vector<int>(int((rect[0]).size()), 0));
  for (int i = 0; i <= int((rect).size()) - 1; i++) {
    vector<int> t;
    for (int j = 0; j <= int((rect[i]).size()) - 1; j++) {
      if (rect[i][j] >= ans) t.push_back(j);
    }
    for (int j = 0; j <= int((t).size()) - 2; j++) {
      for (int k = j + 1; k <= int((t).size()) - 1; k++) {
        if (good[t[j]][t[k]]) return true;
        good[t[j]][t[k]] = 1;
      }
    }
  }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  vector<vector<int> > rect(n, vector<int>(m));
  for (int i = 0; i <= int((rect).size()) - 1; i++) {
    for (int j = 0; j <= int((rect[i]).size()) - 1; j++) cin >> rect[i][j];
  }
  int u = 1e9, l = 0, med;
  while (l < u) {
    med = (l + u) / 2 + 1;
    if (possible(med, rect))
      l = med;
    else
      u = med - 1;
  }
  cout << l;
  return 0;
}
