#include #include int n; int is_available[64][31]; int solve(int person, int day) /* A Variety of Prim's Method */ { int k, t, d, val[64], unseen = (1 << 15); int min = n, date[64], n_zero; if (!is_available[person][day]) { return 0; } for (k = 0; k < n; k++) { val[k] = -unseen; date[k] = -1; } val[n] = -(unseen+1); for (k = person; k != n; k = min, min = n) { int maxd = 0; if (k == person) { date[k] = day; } val[k] = -val[k]; if (val[k] == unseen) { val[k] = 0; } for (t = 0; t < n; t++) { if (val[t] < 0) { for (d = date[k]; d >= 1; d--) { int found = 0; if (is_available[k][d] && is_available[t][d] && date[t] < d) { val[t] = -1; date[t] = d; found = 1; } if (val[t] >= val[min] && date[t] > maxd) { min = t; maxd = date[t]; } if (found) { break; } } } } } n_zero = 0; for (k = 0; k < n; k++) { if (val[k] < 0) { return 0; } if (val[k] == 0) { n_zero++; if (n_zero > 1) { return 0; } } } return 1; } int main() { int i, j, solved = 0; int I; for (I = 0; ; I++) { scanf("%d", &n); if (n == 0) { break; } for (i = 0; i < n; i++) { int f; for (j = 0; j <= 30; j++) { is_available[i][j] = 0; } scanf("%d", &f); for (j = 0; j < f; j++) { int d; scanf("%d", &d); is_available[i][d] = 1; } } solved = 0; for (i = 1; i <= 30; i++) { for (j = 0; j < n; j++) { if (solve(j, i)) { printf("%d\n", i); solved = 1; break; } } if (solved) { break; } } if (!solved) { printf("-1\n"); } } return 0; }