// @BEGIN_OF_SOURCE_CODE /* @JUDGE_ID: 17243NT 103 C++ "Dynamic Programming" */ // Send to judge@uva.es #include typedef struct { int l[12]; } box; FILE *input; FILE *output; int d, n; int nestseq[40], maxn; box boxes[40]; bool nest[35][35]; int maxlen[35][35]; void nesttable(); int main() { int i, j, k, v; int len[40]; input = stdin; output = stdout; while(fscanf(input, "%d %d", &n, &d) == 2) { for(k = 0; k < n; k++) { fscanf(input, "%d", &boxes[k].l[0]); for(i = 1; i < d; i++) { fscanf(input, "%d", &v); j = i; while(j > 0 && boxes[k].l[j - 1] > v) { boxes[k].l[j] = boxes[k].l[j - 1]; j--; } boxes[k].l[j] = v; } } nesttable(); for(i = 0; i < n; i++) { len[i] = 1; for(j = 0; j < n; j++) { if(nest[j][i]) { len[i] = 0; break; } } } for(k = 0; k < n; k++) { for(i = 0; i < n; i++) { if(len[i] > 0) { for(j = 0; j < n; j++) { if(nest[i][j] && len[i] >= len[j]) { len[j] = len[i] + 1; } } } } } v = 0; for(i = 1; i < n; i++) if(len[i] > len[v]) v = i; printf("%d\n%d", len[v], v + 1); k = len[v]; while(k > 1) { k--; for(i = 0; i < n; i++) if(nest[i][v] && len[i] == k) { v = i; printf(" %d", v + 1); break; } } printf("\n"); } return 0; } void nesttable() { int i, j, k; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { nest[i][j] = true; for(k = 0; k < d; k++) { if(boxes[i].l[k] <= boxes[j].l[k]) { nest[i][j] = false; break; } } } } } // @END_OF_SOURCE_CODE