#include <stdio.h>
#define MAX_K 31
#define MAX_N 11
int k; // number of box, k<=30
int n; // n dimensionality, 1 <= n <=10
int boxs[MAX_K][MAX_N];
int dp[MAX_K];
// a box can be put into b box
bool canFit(int a, int b)
{
// can not fit itself
if (a == b)
return false;
int i;
for (i = 1; i <= n; i++)
{
if (boxs[a][i] >= boxs[b][i])
return false;
}
return true;
}
void print_ans(int i)
{
printf("%d ", i);
for (int j = 1; j <= k; j++)
{
if (canFit(i, j) && dp[i] == dp[j] + 1)
{
print_ans(j);
break;
}
}
}
int memo(int i)
{
int & ans = dp[i];
if (ans > 0) return ans;
ans = 1;
for (int j = 1; j <= k; j++)
{
if (canFit(i, j))
{
int tmp = memo(j) + 1;
if (ans < tmp)
ans = tmp;
}
}
return ans;
}
void swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int Partition(int a[], int low, int high)
{
int x = a[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++)
{
if (a[j] <= x)
{
i = i + 1;
swap(&a[i], &a[j]);
}
}
swap(&a[i + 1], &a[high]);
return i + 1;
}
void QuickSort(int a[], int low, int high)
{
if (low < high)
{
int mid = Partition(a, low, high);
QuickSort(a, low, mid - 1);
QuickSort(a, mid + 1, high);
}
}
int main()
{
int i, j;
freopen("uva103_stackingboxs_input.txt", "r", stdin);
while (scanf("%d %d", &k, &n) != EOF)
{
for (i = 1; i <= k; i++)
{
dp[i] = 0;
for (j = 1; j <= n; j++)
{
scanf("%d", &boxs[i][j]);
}
QuickSort(boxs[i], 1, n);
}
#ifdef DEBUG
for (i = 1; i <= k; i++)
{
for (j = 1; j <= n; j++)
{
printf("%d ", boxs[i][j]);
}
printf("\n");
}
#endif
//
int longest = 0;
int start = 0;
for (i = 1; i <= k; i++)
{
int tmp = memo(i);
if (longest < tmp)
{
longest = tmp;
start = i;
}
}
//
printf("%d\n", longest);
print_ans(start);
printf("\n");
}
return 0;
}