#include typedef struct { int unexp; int exped[120]; int n_exped; int dist; } room_t; room_t room[120]; int n_room; int track[120]; int n_track; int cmp(const int *a, const int *b) { if (*a > *b) return 1; else if (*a == *b) return 0; return -1; } void ptrack() { int i; for (i = 0; i < n_track; i++) { printf("%d(%d) ", track[i], room[track[i]].dist); } printf("\n"); } int main() { int N; int i, j; int l; int x; freopen("ninja.txt", "r", stdin); scanf("%d", &N); for (l = 0; l < N; l++) { n_room = 0; n_track = 0; while (1) { scanf("%d", &x); /* printf(">>%d\n))", x); ptrack(); */ if (x == 0) break; if (x > 0) { if (n_room == 0) { room[n_room].unexp = x; room[n_room].n_exped = 0; room[n_room].dist = 0; track[0] = 0; } else { room[n_room].dist = room[track[n_track - 1]].dist + 1; room[n_room].unexp = x - 1; room[n_room].exped[0] = track[n_track - 1]; room[n_room].n_exped = 1; room[track[n_track - 1]].unexp--; room[track[n_track - 1]].exped[room[track[n_track - 1]].n_exped] = n_room; room[track[n_track - 1]].n_exped++; track[n_track] = n_room; } n_room++; n_track++; } else if (x < 0) { room[track[room[track[n_track - 1]].dist + x]].unexp--; room[track[room[track[n_track - 1]].dist + x]].exped[room[track[room[track[n_track - 1]].dist + x]].n_exped] = track[n_track - 1]; room[track[room[track[n_track - 1]].dist + x]].n_exped++; room[track[n_track - 1]].unexp--; room[track[n_track - 1]].exped[room[track[n_track - 1]].n_exped] = track[room[track[n_track - 1]].dist + x]; room[track[n_track - 1]].n_exped++; } for (i = n_track - 1; i >= 0; i--) { if (room[track[i]].unexp > 0) { break; } else { n_track--; } } } for (i = 0; i < n_room; i++) { printf("%d", i + 1); qsort(room[i].exped, room[i].n_exped, sizeof(int), cmp); for (j = 0; j < room[i].n_exped; j++) { printf(" %d", room[i].exped[j] + 1); } printf("\n"); } } }