/* Sat Oct 25 00:57:00 JST 2003 */ /* Sat Oct 25 02:00:26 JST 2003 */ #include int queue[101], front, rear; int inqueue[101]; #define NEXT(x) (((x)+1)%101) void enqueue(int x) { queue[front] = x; inqueue[x] = 1; front = NEXT(front); } int peek() { return queue[rear]; } int dequeue() { int p = peek(); inqueue[p] = 0; rear = NEXT(rear); return p; } #define CHARGE(x) ((x)&1) #define CONSUME(x) (!(CHARGE(x))) int sched[101][51]; int stage[101]; int count[101]; int available, available_reserve; int main() { int i, j; int g, t; int guards, duration; int idle; while (1) { scanf("%d %d", &guards, &duration); if (guards == 0 && duration == 0) break; for (i = 0; i < guards; i++) { for (j = 0; ; j++) { scanf("%d", &sched[i][j]); if (sched[i][j] == 0) break; } } for (i = 0; i < guards; i++) { stage[i] = 0; count[i] = 0; inqueue[i] = 0; } available = 1; available_reserve = 0; idle = 0; front = rear = 0; for (t = 0; t < duration; t++) { if (available) { if (front != rear) { dequeue(); available = 0; } } for (g = 0; g < guards; g++) { if (CONSUME(stage[g])) { count[g]++; if (count[g] >= sched[g][stage[g]]) { count[g] = 0; stage[g]++; enqueue(g); } } else { if (!inqueue[g]) { count[g]++; if (count[g] >= sched[g][stage[g]]) { count[g] = 0; stage[g]++; if (sched[g][stage[g]] == 0) stage[g] = 0; available_reserve = 1; } } else { idle++; } } } if (available_reserve) { available = 1; available_reserve = 0; } } printf("%d\n", idle); } return 0; }