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.*;
import java.io.*;

public class Main {
	public static void main(String args[]) {new Main().run();}

	FastReader in = new FastReader();
	PrintWriter out = new PrintWriter(System.out);
	void run(){
		work();
		out.flush();
	}
	long mod=1000000007;
	long gcd(long a,long b) {
		return a==0?b:b>=a?gcd(b%a,a):gcd(b,a);
	}
	int n,m;
	int[] ret;
	void work() {
		n=in.nextInt();
		m=in.nextInt();
		int[][] A=new int[n][m];
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				A[i][j]=in.nextInt();
			}
		}
		int l=0,r=1000000001;
		while(l<r) {
			int mid=(l+r)/2;
			if(check(mid,A)) {
				l=mid+1;
			}else {
				r=mid;
			}
		}
		out.println(ret[0]+" "+ret[1]);
	}
	private boolean check(int mid,int[][] A) {
		int[] rec=new int[1<<m];
		Arrays.fill(rec,-1);
		for(int i=0;i<n;i++) {
			int cur=0;
			for(int j=0;j<m;j++) {
				if(A[i][j]>=mid) {
					cur|=1<<j;
				}
			}
			rec[cur]=i;
		}
		for(int i=0;i<1<<m;i++) {
			if(rec[i]>=0) {
				int v=(1<<m)-1-i;
				for(int j=v;j<1<<m;j++) {
					if((j&v)!=v) {
						j|=v;
					}
					if(rec[j]>=0) {
						ret=new int[] {rec[i]+1,rec[j]+1};
						return true;
					}
				}
			}
		}
		return false;
	}
}	



class FastReader
{
	BufferedReader br;
	StringTokenizer st;

	public FastReader()
	{
		br=new BufferedReader(new InputStreamReader(System.in));
	}


	public String next() 
	{
		while(st==null || !st.hasMoreElements())//回车，空行情况
		{
			try {
				st = new StringTokenizer(br.readLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return st.nextToken();
	}

	public int nextInt() 
	{
		return Integer.parseInt(next());
	}

	public long nextLong()
	{
		return Long.parseLong(next());
	}
}