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:
/*
If you want to aim high, aim high
Don't let that studying and grades consume you
Just live life young
******************************
If I'm the sun, you're the moon
Because when I go up, you go down
*******************************
*/
import java.util.*;
import java.io.*;

   public class D
   {
      public static void main(String omkar[]) throws Exception
      {
         BufferedReader infile = new BufferedReader(new InputStreamReader(System.in));  
         StringTokenizer st = new StringTokenizer(infile.readLine());
         int N = Integer.parseInt(st.nextToken());
         int M = Integer.parseInt(st.nextToken());
         int[][] arr = new int[N][M];
         for(int i=0; i < N; i++)
            arr[i] = readArr(M, infile, st);
         if(N == 1)
         {
            System.out.println("1 1");
            return;
         }
         if(N == 2)
         {
            System.out.println("1 2");
            return;
         }
         //shit
         String rest = "";
         int low = 0;
         int high = 1000000000;
         while(low != high)
         {
            /*
            int minx = Math.max(arr[0][0], arr[1][0]);
            for(int i=0; i < M; i++)
               minx = Math.min(minx, Math.max(arr[0][i], arr[1][i]));
            */
            int minx = (low+high+1)/2;
            ArrayList<Integer> masks = new ArrayList<Integer>();
            for(int i=0; i < N; i++)
            {
               int mask = 0;
               for(int a=0; a < M; a++)
                  if(arr[i][a] >= minx)
                     mask |= 1 << a;
               masks.add(mask);
            }
            int[] res = new int[2];
            int[] bash = purge(masks);
            for(int a=0; a < bash.length; a++)
               for(int b=0; b < bash.length; b++)
                  if(Integer.bitCount(bash[a]|bash[b]) == M)
                  {
                     res[0] = bash[a];
                     res[1] = bash[b];
                  }
            if(res[0]+res[1] == 0)
               high = minx-1;
            else
            {
               low = minx;
               for(int p=0; p < 2; p++)
                  for(int i=0; i < N; i++)
                     if(res[p] == masks.get(i))
                     {
                        res[p] = i;
                        break;
                     }
               rest = (res[0]+1)+" "+(res[1]+1);
            }
         }
         if(rest.length() == 0)
            rest = "1 1";
         System.out.println(rest);
      }
      public static int[] purge(ArrayList<Integer> masks)
      {
         boolean[] seen = new boolean[1000];
         for(int x: masks)
            seen[x] = true;
         int cnt = 0;
         for(int i=0; i < 1000; i++)
            if(seen[i])
               cnt++;
         int[] boof = new int[cnt];
         int bomkar = 0;
         for(int i=0; i < 999; i++)
            if(seen[i])
               boof[bomkar++] = i;
         return boof;
      }
      public static int[] readArr(int N, BufferedReader infile, StringTokenizer st) throws Exception
      {
         int[] arr = new int[N];
         st = new StringTokenizer(infile.readLine());
         for(int i=0; i < N; i++)
            arr[i] = Integer.parseInt(st.nextToken());
         return arr;
      }
   }