#include <bits/stdc++.h>
using namespace std;
struct pkt {
  long long x, y;
};
struct kraw {
  int a;
  pkt pocz, kon;
  int r;
};
map<pair<int, int>, int> M;
long long Wek(pkt a, pkt b, pkt c) {
  long long w1x = b.x - a.x, w2x = c.x - a.x;
  long long w1y = b.y - a.y, w2y = c.y - a.y;
  return w1x * w2y - w2x * w1y;
}
bool por(kraw a, kraw b) {
  a.kon.x -= a.pocz.x;
  a.kon.y -= a.pocz.y;
  b.kon.x -= b.pocz.x;
  b.kon.y -= b.pocz.y;
  if (a.kon.y == 0 && a.kon.x > 0) return true;
  if (b.kon.y == 0 && b.kon.x > 0) return false;
  if (a.kon.y == 0 && a.kon.x < 0) return (b.kon.y < 0);
  if (b.kon.y == 0 && b.kon.x < 0) return (a.kon.y > 0);
  if (a.kon.y > 0 && b.kon.y > 0)
    return (a.kon.x * b.kon.y > a.kon.y * b.kon.x);
  if (a.kon.y < 0 && b.kon.y < 0)
    return (a.kon.x * b.kon.y > a.kon.y * b.kon.x);
  return (a.kon.y > 0);
}
void dfs(int akt, int oj, vector<vector<kraw> >& G, vector<int>& wlk,
         vector<bool>& odw) {
  odw[akt] = true;
  vector<bool> wyk(G[akt].size(), false);
  for (int i = 0; i < G[akt].size(); ++i) {
    if (!odw[G[akt][i].a]) {
      dfs(G[akt][i].a, akt, G, wlk, odw);
      wyk[i] = true;
    }
  }
  wlk[akt] = 1;
  for (int i = 0; i < G[akt].size(); ++i)
    if (wyk[i]) wlk[akt] += wlk[G[akt][i].a];
  if (oj != -1) {
    G[akt][M[make_pair(akt, oj)]].r = wlk[akt];
    G[oj][M[make_pair(oj, akt)]].r = -wlk[akt];
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<vector<kraw> > G(n + 1);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    G[a].push_back({b, {0, 0}, {0, 0}, 0});
    G[b].push_back({a, {0, 0}, {0, 0}, 0});
  }
  vector<pkt> p(n + 1);
  for (int i = 0; i < n; ++i) cin >> p[i].x >> p[i].y;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < G[i].size(); ++j) {
      G[i][j].pocz = p[i];
      G[i][j].kon = p[G[i][j].a];
    }
  }
  int nr = 0;
  for (int i = 0; i < n; ++i)
    if (p[i].x > p[nr].x) nr = i;
  p[n] = p[nr];
  ++p[n].x;
  G[n].push_back({nr, p[n], p[nr], 0});
  G[nr].push_back({n, p[nr], p[n], 0});
  for (int i = 0; i < n + 1; ++i) sort(G[i].begin(), G[i].end(), por);
  for (int i = 0; i < n + 1; ++i)
    for (int j = 0; j < G[i].size(); ++j) M[make_pair(i, G[i][j].a)] = j;
  vector<int> wlk(n + 1);
  vector<bool> odw(n + 1, false);
  dfs(n, -1, G, wlk, odw);
  vector<vector<int> > pref(n + 1);
  for (int i = 0; i < n + 1; ++i) {
    pref[i].push_back(G[i][0].r);
    for (int j = 1; j < G[i].size(); ++j)
      pref[i].push_back(pref[i].back() + G[i][j].r);
  }
  int q;
  cin >> q;
  for (int i = 0; i < q; ++i) {
    int k;
    cin >> k;
    vector<int> pyt(k);
    for (int j = 0; j < k; ++j) {
      cin >> pyt[j];
      --pyt[j];
    }
    int max_y = -1000000000;
    for (int j = 0; j < k; ++j) max_y = max((long long)max_y, p[pyt[j]].y);
    bool ok = true;
    for (int j = 0; j < k; ++j) {
      int a = pyt[j], b = pyt[(j + 1) % k], c = pyt[(j + 2) % k];
      if (p[b].y == max_y && Wek(p[a], p[b], p[c]) < 0) ok = false;
    }
    if (!ok) reverse(pyt.begin(), pyt.end());
    int odp = 0;
    for (int j = 0; j < k; ++j) {
      int a = pyt[j], b = pyt[(j + 1) % k], c = pyt[(j + 2) % k];
      int pocz = M[make_pair(b, a)];
      int kon = M[make_pair(b, c)];
      if (pocz <= kon) {
        odp += pref[b][kon];
        if (pocz != 0) odp -= pref[b][pocz - 1];
      } else {
        int usu = pref[b][pocz - 1] - pref[b][kon];
        odp += pref[b].back() - usu;
      }
      odp -= G[b][M[make_pair(b, a)]].r;
      odp -= G[b][M[make_pair(b, c)]].r;
    }
    cout << odp << endl;
  }
  return 0;
}
