#include <bits/stdc++.h>
using namespace std;
template <typename T>
void _R(T &x) {
  cin >> x;
}
void _R(int &x) { scanf("%d", &x); }
void _R(long long &x) { scanf("%" PRId64, &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template <typename T, typename... U>
void R(T &head, U &...tail) {
  _R(head);
  R(tail...);
}
template <typename T>
void _W(const T &x) {
  cout << x;
}
void _W(const int &x) { printf("%d", x); }
template <typename T>
void _W(const vector<T> &x) {
  for (auto i = x.cbegin(); i != x.cend(); i++) {
    if (i != x.cbegin()) putchar(' ');
    _W(*i);
  }
}
void W() {}
template <typename T, typename... U>
void W(const T &head, const U &...tail) {
  _W(head);
  putchar(sizeof...(tail) ? ' ' : '\n');
  W(tail...);
}
const int N = 1e5 + 10;
struct E {
  int to, flow;
  long double ang;
};
bool operator<(const E &a, const E &b) { return a.ang < b.ang; }
int n, m;
long long x[N], y[N];
vector<E> e[N];
vector<int> sf[N];
inline long double get_ang(int a, int b) {
  map<pair<int, int>, long double> memo;
  auto k = make_pair(a, b);
  if (memo.count(k))
    return memo[k];
  else
    return memo[k] = atan2l(y[b] - y[a], x[b] - x[a]);
}
double cross(int a, int b) { return x[a] * y[b] - x[b] * y[a]; }
bool vis[N];
int dfs(int p) {
  vis[p] = 1;
  int s = 1;
  for (auto &i : e[p])
    if (!vis[i.to]) {
      int f = dfs(i.to);
      i.flow = -f;
      for (auto &j : e[i.to])
        if (j.to == p) j.flow = f;
      s += f;
    }
  return s;
}
int main() {
  R(n, m);
  for (int i = 0; i < int(m); i++) {
    int a, b;
    R(a, b);
    e[a].push_back({b, 0, 0});
    e[b].push_back({a, 0, 0});
  }
  for (int i = (1); i <= int(n); i++) R(x[i], y[i]);
  int w = 1;
  for (int i = (1); i <= int(n); i++)
    if (x[i] < x[w]) w = i;
  x[0] = x[w] - 1;
  e[0].push_back({w, 0, 0});
  e[w].push_back({0, 0, 0});
  dfs(0);
  for (int i = (0); i <= int(n); i++) {
    for (auto &j : e[i]) j.ang = get_ang(i, j.to);
    sort(begin(e[i]), end(e[i]));
    sf[i].push_back(0);
    for (auto &j : e[i]) sf[i].push_back(sf[i].back() + j.flow);
    ;
  }
  int q;
  R(q);
  while (q--) {
    static int np, p[N];
    R(np);
    for (int i = 0; i < int(np); i++) R(p[i]);
    p[np] = p[0];
    double area = 0;
    for (int i = 0; i < int(np); i++) area += cross(p[i], p[i + 1]);
    if (area < 0) reverse(p, p + np + 1);
    p[np + 1] = p[1];
    int ans = 0;
    for (int ii = 0; ii < int(np); ii++) {
      int i = p[ii], j = p[ii + 1], k = p[ii + 2];
      auto aji = get_ang(j, i);
      auto ajk = get_ang(j, k);
      int ti = lower_bound(begin(e[j]), end(e[j]), E{0, 0, aji}) - e[j].begin();
      int tk = lower_bound(begin(e[j]), end(e[j]), E{0, 0, ajk}) - e[j].begin();
      assert(ti < ((int)(e[j]).size()) && e[j][ti].to == i);
      assert(tk < ((int)(e[j]).size()) && e[j][tk].to == k);
      ;
      if (ti < tk) {
        ans += sf[j][tk] - sf[j][ti + 1];
      } else {
        ans += sf[j].back() - sf[j][ti + 1];
        ans += sf[j][tk];
      }
    }
    W(ans);
  }
  return 0;
}
