#include <bits/stdc++.h>
using namespace std;
int n, m;
class vec {
 public:
  int x, y;
  vec() {}
  vec(int tx, int ty) { x = tx, y = ty; }
  vec operator-(const vec &t) const { return vec(x - t.x, y - t.y); }
  long long operator*(const vec &t) const {
    return (long long)x * t.y - (long long)y * t.x;
  }
} p[100010];
class edge {
 public:
  int s, e, cap;
  double ang;
} g[200010];
edge buildedge(int s, int e) {
  edge ret;
  ret.s = s;
  ret.e = e;
  ret.cap = 0;
  vec t = p[e] - p[s];
  ret.ang = atan2(t.y, t.x);
  return ret;
}
vector<int> out[100010];
vector<int> sumin[100010], sumout[100010];
int st[100010], ed[100010];
inline int cmp(int a, int b) { return g[a].ang < g[b].ang; }
bool vis[100010];
inline int getv(int x) { return x & 1 ? x + 1 : x - 1; }
inline int dfs(int np) {
  vis[np] = 1;
  int ret = 1;
  for (int &x : out[np]) {
    edge &t = g[x];
    if (!vis[t.e]) {
      g[getv(x)].cap = dfs(t.e);
      ret += g[getv(x)].cap;
    }
  }
  return ret;
}
map<int, int> mpin[100010], mpout[100010];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d%d", &st[i], &ed[i]);
  for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].x, &p[i].y);
  int mnp = 1;
  for (int i = 2; i <= n; i++)
    if (p[i].x < p[mnp].x) mnp = i;
  p[0] = p[mnp];
  p[0].x--;
  g[m * 2 + 1] = buildedge(0, mnp);
  g[m * 2 + 2] = buildedge(mnp, 0);
  out[mnp].push_back(m * 2 + 2);
  out[0].push_back(m * 2 + 1);
  for (int i = 1; i <= m; i++) {
    g[i * 2 - 1] = buildedge(st[i], ed[i]);
    g[i * 2] = buildedge(ed[i], st[i]);
    out[ed[i]].push_back(i * 2);
    out[st[i]].push_back(i * 2 - 1);
  }
  for (int i = 0; i <= n; i++) {
    sort(out[i].begin(), out[i].end(), cmp);
    for (int j = 0; j < out[i].size(); j++) mpin[i][g[out[i][j]].e] = j;
  }
  dfs(0);
  for (int i = 0; i <= n; i++) {
    sumin[i].resize(out[i].size());
    sumin[i][0] = g[getv(out[i][0])].cap;
    for (int j = 1; j < out[i].size(); j++)
      sumin[i][j] = sumin[i][j - 1] + g[getv(out[i][j])].cap;
    sumout[i].resize(out[i].size());
    sumout[i][0] = g[out[i][0]].cap;
    for (int j = 1; j < out[i].size(); j++)
      sumout[i][j] = sumout[i][j - 1] + g[out[i][j]].cap;
  }
  int Q;
  scanf("%d", &Q);
  while (Q--) {
    vector<int> pt;
    int K;
    scanf("%d", &K);
    pt.resize(K);
    for (int i = 0; i < K; i++) scanf("%d", &pt[i]);
    long long sum = 0;
    for (int i = 0; i + 1 < K; i++) sum += p[pt[i]] * p[pt[i + 1]];
    sum += p[pt[K - 1]] * p[pt[0]];
    if (sum < 0) reverse(pt.begin(), pt.end());
    int s1 = 0, s2 = 0;
    pt.push_back(pt[0]);
    for (int i = 0; i < K; i++) {
      int l = mpin[pt[i]][pt[(i + K - 1) % K]], r = mpin[pt[i]][pt[i + 1]];
      if (r == (l + 1) % out[pt[i]].size()) continue;
      l = (l + 1) % out[pt[i]].size();
      r = (r + out[pt[i]].size() - 1) % out[pt[i]].size();
      if (l > r)
        s1 += (sumin[pt[i]].back() - sumin[pt[i]][l - 1] + sumin[pt[i]][r]),
            s2 +=
            (sumout[pt[i]].back() - sumout[pt[i]][l - 1] + sumout[pt[i]][r]);
      else
        s1 += sumin[pt[i]][r] - (l ? sumin[pt[i]][l - 1] : 0),
            s2 += sumout[pt[i]][r] - (l ? sumout[pt[i]][l - 1] : 0);
    }
    printf("%d\n", s2 - s1);
  }
  return 0;
}
