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 JAVA):

Solution:
import java.util.HashMap;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scn = new Scanner(System.in);
		int n = scn.nextInt();
		int m = scn.nextInt();
		int max = 0;
		int[][] arr = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				arr[i][j] = scn.nextInt();
				max = Math.max(arr[i][j], max);
			}
		}
		int left = 0;
		int right = max;
		int p1 = -1, p2 = -1;
		long po = (long) (Math.pow(2, m));
		HashMap<Integer, Integer> map = new HashMap<>();
		while (left <= right) {
			int mid = (left + right) / 2;
			for (int i = 0; i < arr.length; i++) {
				int mask = 0;
				for (int j = 0; j < m; j++) {
					if (arr[i][j] >= mid) {
						mask = (mask | (1 << j));
					}
				}
				map.put(mask, i);
			}

			boolean f = false;
			A: for (int val : map.keySet()) {
				for (int v : map.keySet()) {
					int st = (v | val);
					if (st + 1 == po) {
						p1 = map.get(val);
						p2 = map.get(v);
						f = true;
						break A;
					}
				}
			}
			if (!f) {
				right = mid - 1;
			} else {
				left = mid + 1;
			}
			map.clear();
		}
		System.out.println((p1 + 1) + " " + (p2 + 1));
	}

}