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;
const double pi = 3.141592653589;
const long long int zero = 0;
long long int mod = 1000000007;
const long long int inf = 1e9;
const long long int inff = 1000000000000000000;
char digits[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
char al[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
               'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char capital[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
                    'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
                    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) {
    long long int n, m, a;
    cin >> n >> m;
    vector<long long int> arr[n];
    for (int i = 0; i < n; i += 1) {
      for (int j = 0; j < m; j += 1) {
        cin >> a;
        arr[i].push_back(a);
      }
    }
    long long int lo = 0;
    long long int hi = inf + 1000;
    long long int mid;
    long long int ans1 = 0, ans2 = 0;
    long long int power[10];
    power[0] = 1;
    for (int i = 1; i < 10; i += 1) {
      power[i] = 2 * power[i - 1];
    }
    while (hi - lo > 1) {
      mid = (lo + hi) / 2;
      long long int brr[n];
      memset(brr, 0, sizeof(brr));
      for (int i = 0; i < n; i += 1) {
        for (int j = 0; j < m; j += 1) {
          if (arr[i][j] >= mid) {
            brr[i] |= power[j];
          }
        }
      }
      long long int msk[power[m]];
      memset(msk, 0, sizeof(msk));
      for (int i = 0; i < n; i += 1) {
        msk[brr[i]] = i + 1;
      }
      long long int found = 0;
      for (int i = 0; i < power[m]; i += 1) {
        if (msk[i] != 0) {
          for (int j = i; j < power[m]; j += 1) {
            if (msk[j] != 0) {
              if ((i | j) == power[m] - 1) {
                found = 1;
                ans1 = msk[i];
                ans2 = msk[j];
                break;
              }
            }
          }
        }
        if (found == 1) {
          break;
        }
      }
      if (found == 1) {
        lo = mid;
      } else {
        hi = mid;
      }
    }
    long long int brr[n];
    memset(brr, 0, sizeof(brr));
    for (int i = 0; i < n; i += 1) {
      for (int j = 0; j < m; j += 1) {
        if (arr[i][j] >= lo) {
          brr[i] |= power[j];
        }
      }
    }
    long long int msk[power[m]];
    memset(msk, 0, sizeof(msk));
    for (int i = 0; i < n; i += 1) {
      msk[brr[i]] = i + 1;
    }
    for (int i = 0; i < power[m]; i += 1) {
      if (msk[i] != 0) {
        for (int j = i; j < power[m]; j += 1) {
          if (msk[j] != 0) {
            if ((i | j) == power[m] - 1) {
              ans1 = msk[i];
              ans2 = msk[j];
              break;
            }
          }
        }
      }
    }
    cout << ans1 << " " << ans2;
  }
}