#include <bits/stdc++.h>
using namespace std;
int n, m, q, k, a[110000], cnt, tmp[110000];
int edgenum = 1, vet[610000], val[610000], Next[610000], Head[110000];
double ang[610000];
bool vis[110000];
map<pair<int, int>, int> rnk;
vector<long long> sum[110000];
struct node {
  int x, y;
  node() {}
  node(int _x, int _y) : x(_x), y(_y) {}
} p[110000];
node operator-(const node &a, const node &b) {
  return node(a.x - b.x, a.y - b.y);
}
char Getchar() {
  static char now[1 << 20], *S, *T;
  if (T == S) {
    T = (S = now) + fread(now, 1, 1 << 20, stdin);
    if (T == S) return EOF;
  }
  return *S++;
}
int read() {
  int x = 0, f = 1;
  char ch = Getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = Getchar();
  }
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = Getchar();
  return x * f;
}
void addedge(int u, int v) {
  vet[++edgenum] = v;
  Next[edgenum] = Head[u];
  Head[u] = edgenum;
}
int dfs(int u) {
  vis[u] = true;
  int flow = 1, tmp;
  for (int e = Head[u]; e; e = Next[e])
    if (!vis[vet[e]]) {
      tmp = dfs(vet[e]);
      val[e] += tmp;
      val[e ^ 1] -= tmp;
      flow += tmp;
    }
  return flow;
}
inline bool cmp(int a, int b) { return ang[a] < ang[b]; }
inline long long cross(node x, node y) {
  return 1ll * x.x * y.y - 1ll * x.y * y.x;
}
int main() {
  n = read();
  m = read();
  int u, v;
  for (int i = 1; i <= m; i++) {
    u = read();
    v = read();
    addedge(u, v);
    addedge(v, u);
  }
  for (int i = 1; i <= n; i++) p[i].x = read(), p[i].y = read();
  int rt = 1;
  for (int i = 2; i <= n; i++)
    if (p[i].x < p[rt].x) rt = i;
  dfs(rt);
  for (int u = 1; u <= n; u++) {
    cnt = 0;
    for (int e = Head[u]; e; e = Next[e]) {
      tmp[++cnt] = e;
      v = vet[e];
      ang[e] = atan2(p[v].y - p[u].y, p[v].x - p[u].x);
    }
    sort(tmp + 1, tmp + cnt + 1, cmp);
    sum[u].push_back(0);
    for (int i = 1; i <= cnt; i++) {
      rnk[pair<int, int>(u, vet[tmp[i]])] = i;
      sum[u].push_back(sum[u].back() + val[tmp[i]]);
    }
  }
  q = read();
  int l, r;
  while (q--) {
    k = read();
    for (int i = 1; i <= k; i++) a[i] = read();
    long long s = 0, ans = k;
    for (int i = 2; i < k; i++)
      s += cross(p[a[i]] - p[a[1]], p[a[i + 1]] - p[a[1]]);
    if (s < 0) reverse(a + 1, a + k + 1);
    a[0] = a[k];
    a[k + 1] = a[1];
    for (int i = 1; i <= k; i++) {
      l = rnk[pair<int, int>(a[i], a[i + 1])];
      r = rnk[pair<int, int>(a[i], a[i - 1])];
      ans += sum[a[i]][r] - sum[a[i]][l - 1];
      if (l > r) ans += sum[a[i]][(int)sum[a[i]].size() - 1];
    }
    printf("%lld\n", ans);
  }
  return 0;
}
