#include <bits/stdc++.h>
using namespace std;
const char lf = '\n';
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
template <typename T1, typename T2>
inline T1 gmax(T1 &a, T2 b) {
  return a = a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 gmin(T1 &a, T2 b) {
  return a = a < b ? a : b;
}
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0, b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + (c - 48), c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 300007, __ = _ << 1;
const long double eps = 1e-10;
struct points {
  long long x, y;
  points(long long x_ = 0, long long y_ = 0) { x = x_, y = y_; }
  friend points operator+(points a, points b) {
    return points(a.x + b.x, a.y + b.y);
  }
  friend points operator-(points a, points b) {
    return points(a.x - b.x, a.y - b.y);
  }
  long double ang() { return atan2(y, x); }
};
inline long long dox(points a, points b) { return a.x * b.x + a.y * b.y; }
inline long long cox(points a, points b) { return a.x * b.y - a.y * b.x; }
int to[__], ne[__], ev[__] = {0}, er[__] = {0}, he[__] = {0}, ecnt = 1;
long double dir[__];
map<pair<int, int>, int> hs;
void adde(int a, int b) {
  to[++ecnt] = b, ne[ecnt] = he[a], he[a] = hs[make_pair(a, b)] = ecnt;
}
void addde(int a, int b) { adde(a, b), adde(b, a); }
int n, m, rt = 1, sz[_] = {0};
points p[_];
void dfs(int x) {
  sz[x] = 1;
  for (int i = he[x]; i; i = ne[i]) {
    int b = to[i];
    if (sz[b]) continue;
    dfs(b), sz[x] += sz[b], ev[i] += sz[b], ev[i ^ 1] -= sz[b];
  }
}
vector<int> hav[_], sv[_];
int sval[_] = {0};
int ps[_] = {0}, lps = 0;
void finder() {
  lps = ty();
  for (int i = 1; i <= lps; i++) ps[i] = ty();
  ps[0] = ps[lps], ps[lps + 1] = ps[1];
  int ans = lps;
  long long temp = 0;
  for (int i = 1; i <= lps; i++) temp += cox(p[ps[i]], p[ps[i + 1]]);
  if (temp < 0)
    reverse(ps + 1, ps + lps + 1), ps[0] = ps[lps], ps[lps + 1] = ps[1];
  for (int i = 1; i <= lps; i++) {
    int l = er[hs[make_pair(ps[i], ps[i + 1])]];
    int r = er[hs[make_pair(ps[i], ps[i - 1])]];
    ans += sv[ps[i]][r] - sv[ps[i]][l - 1];
    if (l > r) ans += sval[ps[i]];
  }
  cout << ans << lf;
}
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), m = ty();
  for (int i = 1, a, b; i <= m; i++) a = ty(), b = ty(), addde(a, b);
  for (int i = 1, a, b; i <= n; i++) a = ty(), b = ty(), p[i] = points(a, b);
  for (int i = 2; i <= n; i++)
    if (p[i].x < p[rt].x) rt = i;
  dfs(rt);
  for (int x = 1; x <= n; x++) {
    hav[x].emplace_back(0);
    for (int i = he[x]; i; i = ne[i]) {
      hav[x].emplace_back(i), sval[x] += ev[i];
      dir[i] = (p[to[i]] - p[x]).ang();
    }
    sort(hav[x].begin(), hav[x].end(), [](int a, int b) -> int {
      if (!a) return 1;
      if (!b) return 0;
      return dir[a] < dir[b];
    });
    sv[x].resize(((int)((hav[x]).size())), 0);
    for (int i = 1; i < ((int)((hav[x]).size())); i++)
      er[hav[x][i]] = i, sv[x][i] = sv[x][i - 1] + ev[hav[x][i]];
  }
  int qn = ty();
  for (int qq = 1; qq <= qn; qq++) finder();
  return 0;
}
