//1154 Vertex Coloring (25 分)
//#include
//#include
//using namespace std;
//const int MAXV = 10010;
//const int INF = 1000000000;
//int n, m, a, b, k;
//vectorvt;
//bool vis[MAXV] = { false };
//int edge[MAXV][MAXV];
//int c[MAXV];
//bool flag = false;
//
//bool isin(vector v, int a) {
// vector::iterator it;
// it = find(v.begin(), v.end(), a);
// if (it != v.end()) return true;
// else return false;
//}
//void DFS(int i) {
// vis[i] = true;
// for (int j = 0; j < n; j++) {
// if (vis[j] == false && edge[i][j] != INF && c[i] != c[j]) {
// if(!isin(vt, c[j]))
// vt.push_back(c[j]);
//
// DFS(j);
// }
// else if (c[i] == c[j])
// flag = true;
//
// }
//}
//void DFSTrave() {
// for (int i = 0; i < n; i++) {
// if (vis[i] == false) {
// if (!isin(vt, c[i]))
// vt.push_back(c[i]);
// DFS(i);
// }
//
// }
//}
//int main() {
//
// cin >> n >> m ;
//
// for (int i = 0; i < m; i++) {
// cin >> a >> b;
// edge[a][b] = edge[b][a] = 1;
// }
// cin >> k;
// while (k--) {
// for (int i = 0; i < n; i++)
// cin >> c[i];
// DFSTrave;
// if (flag == false)
// cout << vt.size() << " - coloring" << endl;
// else cout << "No" << endl;
// flag = false;
// vt.clear();
// vis[MAXV] = { false };
// }
// return 0;
//}
#include
#include
#include
using namespace std;
int main() {
int n, m, k;
int c[10010];
cin >> n >> m;
vector>v;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
v.push_back({ a,b });
}
cin >> k;
while (k--) {
unordered_setcolors;
for (int i = 0; i < n; i++) {
cin >> c[i];
colors.insert(c[i]);
}
bool flag = true;
for (int i = 0; i < v.size()&&flag; i++)
if (c[v[i].first] == c[v[i].second])
flag = false;
if (!flag) cout << "No" << endl;
else cout << colors.size() << "-coloring" << endl;
}
return 0;
}