Problem: You are given n arrays a_1, a_2, ..., a_n; each array consists of exactly m integers. We denote the y-th element of the x-th array as a_{x, y}.

You have to choose two arrays a_i and a_j (1 ≤ i, j ≤ n, it is possible that i = j). After that, you will obtain a new array b consisting of m integers, such that for every k ∈ [1, m] b_k = max(a_{i, k}, a_{j, k}).

Your goal is to choose i and j so that the value of min _{k = 1}^{m} b_k is maximum possible.

Input

The first line contains two integers n and m (1 ≤ n ≤ 3 ⋅ 10^5, 1 ≤ m ≤ 8) — the number of arrays and the number of elements in each array, respectively.

Then n lines follow, the x-th line contains the array a_x represented by m integers a_{x, 1}, a_{x, 2}, ..., a_{x, m} (0 ≤ a_{x, y} ≤ 10^9).

Output

Print two integers i and j (1 ≤ i, j ≤ n, it is possible that i = j) — the indices of the two arrays you have to choose so that the value of min _{k = 1}^{m} b_k is maximum possible. If there are multiple answers, print any of them.

Example

Input


6 5
5 0 3 1 2
1 8 9 1 3
1 2 3 4 5
9 1 0 3 7
2 3 0 6 3
6 4 1 7 0


Output


1 5

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
using ll = long long;
using P = pair<ll, ll>;
constexpr long double PI = 3.14159265358979323846264338327950288L;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
class DMinimaxProblem {
 public:
  void solve(istream& cin, ostream& cout) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> dp(n, vector<int>(m));
    for (int i = 0; i < (int)(n); i++) {
      for (int j = 0; j < (int)(m); j++) {
        cin >> dp[i][j];
      }
    }
    int mi = 0;
    int ma = INT_MAX;
    int ans1 = 1;
    int ans2 = 1;
    int r = 1 << m;
    while (mi + 1 < ma) {
      int med = (mi + ma) / 2;
      bool flag = false;
      vector<int> cnt(r, 0);
      for (int i = 0; i < (int)(n); i++) {
        int now = 0;
        for (int j = 0; j < (int)(m); j++) {
          now *= 2;
          if (dp[i][j] >= med) {
            now++;
          }
        }
        cnt[now] = i + 1;
      }
      for (int i = 0; i < r; i++) {
        if (cnt[i] == 0) continue;
        for (int j = 0; j < r; j++) {
          if (cnt[j] > 0 && (i | j) == r - 1) {
            flag = true;
            ans1 = cnt[i];
            ans2 = cnt[j];
            42;
            break;
          }
        }
        if (flag) break;
      }
      if (flag) {
        mi = med;
      } else {
        ma = med;
      }
    }
    42;
    cout << ans1 << ' ' << ans2 << endl;
  }
};
signed main() {
  DMinimaxProblem solver;
  std::istream& in(std::cin);
  std::ostream& out(std::cout);
  solver.solve(in, out);
  return 0;
}