#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  if (flag) x = -x;
}
using namespace std;
int n, m;
struct Vectors {
  long long x, y;
  Vectors(long long xx = 0, long long yy = 0) { x = xx, y = yy; }
  inline Vectors operator+(const Vectors &a) const {
    return Vectors(x + a.x, y + a.y);
  }
  inline Vectors operator-(const Vectors &a) const {
    return Vectors(x - a.x, y - a.y);
  }
  inline long long operator*(const Vectors &a) const {
    return x * a.y - y * a.x;
  }
  inline double get_ang() { return atan2(y, x); }
} vt[101000];
struct edge {
  int nxt, to, val;
  edge() {}
  edge(int jzp, int zzz, int lsr) { nxt = jzp, to = zzz, val = lsr; }
} e[101000 << 1];
int head[101000], ecnt = 1;
inline void addedge(int from, int to) {
  e[++ecnt] = edge(head[from], to, 0);
  head[from] = ecnt;
}
bool vis[101000];
int dfs(int cur) {
  vis[cur] = true;
  int sz = 1;
  for (int i = head[cur]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (vis[to]) continue;
    int tmp = dfs(to);
    sz += tmp;
    e[i].val -= tmp;
    e[i ^ 1].val += tmp;
  }
  return sz;
}
struct Tri {
  int to;
  double ang;
  int val;
  Tri() {}
  Tri(int jzp, double zzz, int lsr) { to = jzp, ang = zzz, val = lsr; }
} tri[101000];
int ttot;
inline bool jzpcmp(const Tri &a, const Tri &b) { return a.ang < b.ang; }
vector<int> sum[101000];
map<int, int> mp[101000];
inline void init() {
  for (int cur = 1; cur <= n; ++cur) {
    ttot = 0;
    for (int i = head[cur]; i; i = e[i].nxt) {
      int to = e[i].to;
      tri[++ttot] = Tri(to, (vt[to] - vt[cur]).get_ang(), e[i].val);
    }
    sort(tri + 1, tri + 1 + ttot, jzpcmp);
    sum[cur].resize(ttot + 1);
    for (int i = 1; i <= ttot; ++i)
      mp[cur][tri[i].to] = i, sum[cur][i] = sum[cur][i - 1] + tri[i].val;
  }
}
int rt = 1, id[101000];
inline void work() {
  read(m);
  for (int i = 1; i <= m; ++i) read(id[i]);
  id[0] = id[m];
  long long S = 0;
  for (int i = 1; i <= m; ++i) S += vt[id[i - 1]] * vt[id[i]];
  if (S < 0) reverse(id + 1, id + 1 + m);
  id[0] = id[m];
  id[m + 1] = id[1];
  int res = 0;
  for (int i = 1; i <= m; ++i) {
    int cur = id[i];
    if (cur == rt) res += n;
    int l = mp[cur][id[i - 1]], r = mp[cur][id[i + 1]];
    int tmp = sum[cur][r] - sum[cur][l - 1];
    if (l > r) tmp += sum[cur].back();
    res += tmp;
  }
  printf("%d\n", res);
}
int main() {
  read(n), read(m);
  for (int i = 1; i <= m; ++i) {
    int u, v;
    read(u), read(v);
    addedge(u, v), addedge(v, u);
  }
  for (int i = 1; i <= n; ++i) {
    read(vt[i].x), read(vt[i].y);
    if (vt[i].x < vt[rt].x) rt = i;
  }
  dfs(rt);
  init();
  int q;
  read(q);
  while (q--) work();
  return 0;
}
