WA了一些点,但不多
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
using namespace std;
int n,m,k,a[100005],u[25],v[25];
int id[100005],cnt;
bool vis[100005];
vector<int> tem[100005];
int num[100005],tmp[100005],ans;
vector<int> spt;
size_t r[105],x[105],p[105],q[105],prt;
inline void dfs(int d){
if(x[d]==0&&p[d]==0){
if(__builtin_popcount(r[d])>ans) ans=__builtin_popcount(r[d]),prt=r[d];
return;
}
int u=0;
for(int i=1;i<=cnt;i++){
if(p[d]&(1ull<<i)){
if(!u) u=i;
if(q[u]&(1ull<<i)) continue;
r[d+1]=r[d];
r[d+1]|=(1ull<<i);
p[d+1]=(p[d]&q[i]);
x[d+1]=(x[d]&q[i]);
dfs(d+1);
p[d]^=(1ull<<i),x[d]|=(1ull<<i);
}
}
}
int main(){
// freopen("09","r",stdin);
// freopen("war.in","r",stdin);
// freopen("war.out","w",stdout);
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
tem[a[i]].push_back(i);
}
cin>>k;
for(int i=1;i<=k;i++){
cin>>u[i]>>v[i];
if(!id[u[i]]) id[u[i]]=++cnt;
if(!id[v[i]]) id[v[i]]=++cnt;
}
for(int i=1;i<=n;i++){
if(id[i]) num[a[i]]++,vis[a[i]]=1,tmp[a[i]]=i;
}
for(int i=1;i<=m;i++){
if(vis[i]){
for(auto v:tem[i]){
if(!id[v]){
if(num[i]==1) id[v]=id[tmp[i]],id[tmp[i]]=0;
else id[v]=++cnt;
break;
}
}
}
}
cnt=0;
for(int i=1;i<=n;i++){
if(id[i]) id[i]=++cnt,spt.push_back(i);
}
for(auto u:spt){
for(auto v:spt){
if(u==v) continue;
if(a[u]!=a[v]) q[id[u]]|=(1ull<<id[v]);
}
}
for(int i=1;i<=k;i++){
if(!id[u[i]]||!id[v[i]]) continue;
q[id[u[i]]]|=(1ull<<id[v[i]]),q[id[v[i]]]|=(1ull<<id[u[i]]);
if(a[u[i]]!=a[v[i]]){
q[id[u[i]]]^=(1ull<<id[v[i]]),q[id[v[i]]]^=(1ull<<id[u[i]]);
}
}
for(int i=1;i<=cnt;i++){
p[0]|=(1ull<<i);
}
dfs(0);
for(int i=1;i<=m;i++){
if(!vis[i]) ans++;
}
cout<<ans<<'\n';
for(int i=1;i<=m;i++){
if(!vis[i]) cout<<tem[i][0]<<' ';
}
for(int i=1;i<=cnt;i++){
if(prt&(1ull<<i)) cout<<spt[i-1]<<' ';
}
return 0;
}