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

Solution:
import sys
input = sys.stdin.readline

n,m=map(int,input().split())
A=[list(map(int,input().split())) for i in range(n)]

SET=set()
for a in A:
    SET|=set(a)

compression_dict={a: ind for ind, a in enumerate(sorted(SET))}

for i in range(n):
    A[i]=[compression_dict[a] for a in A[i]]

OK=0
NG=len(compression_dict)
ANS=[1,1]
B=[set()]*n
P=[2,3,5,7,11,13,17,19]
Q=1
for j in range(m):
    Q*=P[j]
    
import math

def ya(x):
    xr=math.ceil(math.sqrt(x))

    LIST=[]
    for i in range(1,xr+1):
        if x%i==0:
            LIST.append(i)
            LIST.append(x//i)

    return LIST

while NG>OK+1:
    mid=(OK+NG)//2
    SET=set()

    for i in range(n):
        NOW=1
        for j in range(m):
            if A[i][j]>=mid:
                NOW*=P[j]
        B[i]=NOW
        SET.add(NOW)

    #print(mid,SET)
    flag=0

    for s in SET:
        for l in ya(s):
            if Q//l in SET:
                flag=1
                OK=mid
                break
        if flag:
            break

    else:
        NG=mid

SET=set()
for i in range(n):
    NOW=1
    for j in range(m):
        if A[i][j]>=OK:
            NOW*=P[j]
    B[i]=NOW
    SET.add(NOW)

flag=0
for i in range(n):
    for l in ya(B[i]):
        if Q//l in SET:
            ANS1=i
            flag=1
            break
    if flag:
        break

LIST=ya(B[i])
SET=set(LIST)

for i in range(n):
    if Q//B[i] in SET:
        ANS2=i

print(ANS1+1,ANS2+1)