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
{
    void solve() throws Exception
    {
        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);
        int n = sc.nextInt() ;
        int m = sc.nextInt() ;
        int [][] a = new int [n][m] ;
        for(int i = 0 ;i  < n ;i ++)
            for(int j = 0 ; j < m ; j++)
                a[i][j] = sc.nextInt();
        int start = 0 , end = (int)1e9 ;
        int ans1 = -1 , ans2 = -1 ;
        while(start <= end)
        {
            int mid = start + end >> 1 ;
            boolean [] masks = new boolean [1 << m] ;
            int [] idx = new int [1 << m] ;
            for(int i = 0 ; i < n ; i++)
            {
                int curr = 0 ;
                for(int j = 0 ; j < m ; j ++)
                    curr |= (a[i][j] >= mid ?  1 : 0) << j;
                masks[curr] = true ;
                idx[curr] = i + 1;
            }
            int idx1 = -1 , idx2  = -1 ;
            outer :
            for(int x = 0 ; x < 1 << m ; x ++)
                for(int y = 0 ; y < 1 << m ; y++)
                    if(masks[x] && masks[y] &&(x | y) == ((1 << m) - 1))
                    {

                        idx1 = idx[x] ; idx2 = idx[y] ;
                        break outer;
                    }
            if(idx1 != -1)
            {
                ans1 = idx1 ; ans2 = idx2 ;
                start = mid + 1 ;
            }
            else
                end = mid - 1 ;
        }
        out.println(ans1+" "+ans2);
        out.close();

    }
    public static void main (String [] args) throws Exception { (new Main()).solve(); }

    class Scanner
    {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

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