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.Arrays;
import java.util.Scanner;

public class bits_subsequences_best_acm {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		int m = s.nextInt();
		int[][] arr = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				arr[i][j] = s.nextInt();
			}
		}
		ans = new int[2];
		int lo = 0;
		int hi = 1000000000;
		int ans1 = -1;
		while (lo <= hi) {
			int mid = (lo + hi) / 2;
			if (possible(arr, mid , m)) {
				lo = mid + 1;
				ans1 = 2;
			} else {
				hi = mid - 1;
			}
		}
		if(ans1 !=-1) {
			System.out.println(++ans[0] +" "+(++ans[1]));
		}
	}
static int[] ans ;
	private static boolean possible(int[][] arr, int x , int m) {

		int[] dp = new int[(int) Math.pow(2, m)];
		int[] new_arr = new int[arr.length];
		Arrays.fill(dp, -1);
		for (int i = 0; i < arr.length; i++) {
			int temp = 0;
			for (int j = 0; j < arr[0].length; j++) {
				if (arr[i][j] >= x) {
					temp = temp | (1 << j);
				}
			}
			dp[temp] = i;
			new_arr[i] = temp;
		}
		for (int j = 0; j < m; j++) {
			for (int i = 0; i < Math.pow(2, m); i++) {
				if(dp[i]==-1)
				if((i&(1<<j))==0 ) {
					int new_ind = (i|(1<<j));
					if(dp[new_ind]!=-1) {
					dp[i] = dp[new_ind];
					}
				}
			}
		}
		
		for(int i = 0 ; i<arr.length ;i++) {
			int temp = (int) (Math.pow(2, m)-1)^new_arr[i];
			if(dp[temp]!=-1   ) {
				ans[0] = i;
				ans[1]  =dp[temp];
				return true;
			}
		}
		return false;
	}
}