int N, M, K;
vector<pair<int, int>> links[100010]; // (nxt, idx)
vector<int> prohibit_list;
int color[100010]; // 0: unvisited, 1: group A, 2: group B
bool prohibited[200010];
bool isBipartite(int cnt){
rep(i, 1, M+1) prohibited[i] = false;
rep(i, 0, cnt) prohibited[prohibit_list[i]] = true;
rep(i, 1, N+1) color[i] = 0;
rep(i, 1, N+1) if(color[i] == 0){
queue<int> Q;
Q.push(i);
color[i] = 1;
while(!Q.empty()){
int cur = Q.front(); Q.pop();
for(auto [nxt, idx]: links[cur]){
if(prohibited[idx]) continue;
if(color[nxt] == 0){
color[nxt] = (color[cur] == 1 ? 2 : 1);
Q.push(nxt);
}
else if(color[nxt] == color[cur]){
return false;
}
}
}
}
return true;
}
void solve(){
cin >> N >> M >> K;
rep(i, 1, M+1){
int u, v; cin >> u >> v;
links[u].push_back({v, i});
links[v].push_back({u, i});
}
rep(i, 0, K){
int p; cin >> p;
prohibit_list.push_back(p);
}
// 모두 금지했을때 이분 그래프인가?
if(!isBipartite(K)){
cout << -1;
return;
}
// 파라메트릭 서치
int ok = K, ng = -1;
while(ok - ng > 1){
int mid = (ok + ng) >> 1;
if(isBipartite(mid)) ok = mid;
else ng = mid;
}
cout << ok << "\n";
int groupA_sz = 0, groupB_sz = 0;
isBipartite(ok);
rep(i, 1, N+1) color[i] == 1 ? groupA_sz++ : groupB_sz++;
cout << min(groupA_sz, groupB_sz) << ' ' << max(groupA_sz, groupB_sz) << "\n";
}