#include<iostream>
#include<set>
#include<vector>
using namespace std;
struct node{
int t1;
int t2;
};
int main(){
int n, m, k;
cin >> n >> m;
vector<node> v(m); // 储存所有边的信息
for(int i = 0; i < m; i++){
cin >> v[i].t1 >> v[i].t2;
}
cin >> k;
while(k--){
int a[10009] = {0}; // 存储每个顶点的颜色
bool flag = true;
set<int> se; // 存储所有颜色
//读取每个顶点的颜色
for(int i = 0; i < n; i++){
cin >> a[i];
se.insert(a[i]);
}
//检查每条边的两个端点颜色是否相同
for(int i = 0; i < m; i++){
if(a[v[i].t1] == a[v[i].t2]){
flag = false;
break;
}
}
if(flag){
cout << se.size() << "-coloring" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}