/*
二分bk,所有比bk大的数设置为1,比bk小的数设置为0
然后得到一个n*m的01矩阵,每行a的状态用s[i]表示,问题转换成判是否存在s[i]|s[j]=(1<<m)-1
再开一个flag[i]统计是否出现过状态i
然后暴力枚举是否存在这样的s[i]|s[j]=(1<<m)-1
*/
#include<bits/stdc++.h>
using namespace std;
#define N 300005
int a[N][10],n,m,s[N],flag[1<<10];
int ans1,ans2;
int judge(int mid){
memset(s,0,sizeof s);
memset(flag,-1,sizeof flag);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
if(a[i][j]>=mid)
s[i]|=(1<<j);
flag[s[i]]=i;
}
for(int i=0;i<(1<<m);i++)if(flag[i]!=-1){
for(int j=0;j<(1<<m);j++)if(flag[j]!=-1)
if((i|j) == (1<<m)-1){
ans1=flag[i]+1,ans2=flag[j]+1;return 1;
}
}
return 0;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
int L=0,R=0x3f3f3f3f,mid;
while(L<=R){
mid=L+R>>1;
if(judge(mid))
L=mid+1;
else R=mid-1;
}
cout<<ans1<<" "<<ans2<<'\n';
}