#include <stdlib.h> #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<map> #include<vector> using namespace std; typedef map<string, int> STRING2MAP; int main() { int n, m; int i, j; int k; char name[25], like[25], hate[25], go[25]; map<string, STRING2MAP> t_map; map<string, STRING2MAP>::iterator it_t; map<string, bool> t_now; map<string, bool>::iterator it_n; STRING2MAP::iterator it_f; STRING2MAP S2M; string t_add[101], t_remove[101]; int p_add, p_remove; int h, l; int geted; while (scanf("%d%d", &n, &m) != EOF) { t_map.clear(); t_now.clear(); for (i=0; i < n; i++) { scanf("%s", name); scanf("%d", &k); t_map[name] = S2M; it_t = t_map.find(name); for (j=0; j < k; j++) { scanf("%s", like); it_t->second.insert(STRING2MAP::value_type(like, 1)); } scanf("%d", &k); for (j=0; j < k; j++) { scanf("%s", hate); it_t->second.insert(STRING2MAP::value_type(hate, 2)); } } scanf("%d", &k); for (j=0; j < k; j++) { scanf("%s", go); t_now[go] = true; } for (i=0; i<m; i++) { p_add = 0; p_remove = 0; it_t=t_map.begin(); for (; it_t != t_map.end(); it_t++) { it_n=t_now.begin(); l=h=0; for (; it_n != t_now.end(); it_n++) { it_f = it_t->second.find(it_n->first); if (it_f != it_t->second.end()) { geted = it_f->second; if (geted & 1) l++; if (geted & 1<<1) h++; if (l>0 && h>0) break; } } if (h == 0 && l > 0) t_add[p_add++] = it_t->first; if (h > 0 && l == 0) t_remove[p_remove++] = it_t->first; } if (p_remove == 0 && p_add == 0) break; for (j=0; j < p_remove; j++) t_now.erase(t_remove[j]); for (j=0; j <p_add; j++) t_now.insert(make_pair(t_add[j], true)); } if (t_now.empty()) { printf("None\n"); continue; } it_n=t_now.begin(); cout<< it_n->first; it_n++; for (; it_n != t_now.end(); it_n++) cout << " " << it_n->first; cout << endl; } return 0; }