#include using namespace std; using ll = long long; template ostream& operator<<(ostream& os, const vector& vec) {if(vec.empty())return os;os << vec[0];for(auto it = vec.begin(); ++it!= vec.end();)os << ' ' << *it;return os;} #include using namespace atcoder; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n, k; cin >> n >> k; vector a(n), pos(n); dsu uf(n); iota(a.begin(), a.end(), 0); for(int i = 0; i < k; i++){ int u, v; cin >> u >> v; swap(a[--u], a[--v]); } for(int i = 0; i < n; i++)uf.merge(i, a[i]); auto G = uf.groups(); vector>> tb; auto cov = [&](vector &a, vector &b){ vector res(a.size()); for(int i = 0; i < a.size(); i++) res[i] = b[a[i]]; return res; }; for(auto &&vec:G){ int m = vec.size(); vector c, pos(m); vector> temp; sort(vec.begin(), vec.end()); for(auto &v:vec) c.push_back(a[v]); for(int i = 0; i < m; i++){ int j = lower_bound(vec.begin(), vec.end(), c[i]) - vec.begin(); pos[j] = i; } //cerr << pos << '\n'; vector d(m), nxt(m); iota(d.begin(), d.end(), 0); for(int i = 0; i < m; i++){ //cerr << d << '\n'; temp.push_back(cov(d, vec)); for(int j = 0; j < m; j++){ nxt[pos[j]] = d[j]; } swap(d, nxt); } tb.push_back(temp); } auto comp = [&](int i, vector &temp){ for(int j = 0; j < G[i].size(); j++){ //cerr << tb[i][j] << " " << temp << '\n'; if(tb[i][j] == temp) return j; } return -1; }; int Q; cin >> Q; while(Q--){ vector c(n); vector r(G.size()), mo(G.size()); for(auto &v:c)cin >> v, v--; bool is_zero = false; for(int i = 0; i < G.size(); i++){ int m = G[i].size(); vector temp; for(auto &v:G[i])temp.push_back(c[v]); //cerr << temp << '\n'; r[i] = comp(i, temp); mo[i] = m; if(r[i] == -1){ is_zero = true; break; } } if(is_zero){ cout << -1 << '\n'; continue; } auto p = crt(r, mo); if(p.second == 0){ cout << -1 << '\n'; continue; } if(p.first == 0)p.first += p.second; cout << p.first << '\n'; } }