#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int x;
  scanf("%d", &x);
  return x;
}
const double PI = 3.14159265;
const int N = 200002;
long long x[N], y[N], sz[N], center, n, m;
map<pair<int, int>, int> w;
vector<int> g[N], psum[N];
map<int, int> ind[N];
bool mark[N];
double getKhar(int a, int b) {
  int dx = x[b] - x[a];
  int dy = y[b] - y[a];
  double th = atan2(dy, dx);
  return PI - th;
}
bool cmp(int i, int j) { return getKhar(center, i) < getKhar(center, j); }
int dfs(int v) {
  mark[v] = sz[v] = 1;
  for (int u : g[v])
    if (!mark[u]) {
      sz[v] += dfs(u);
      w[{v, u}] = -sz[u];
      w[{u, v}] = sz[u];
    }
  return sz[v];
}
double area(vector<int> &v) {
  double ans = 0;
  for (int i = 0; i < v.size(); i++) {
    int a = v[i];
    int b = v[(i + 1) % v.size()];
    ans += (x[a] + x[b]) * (y[b] - y[a]);
  }
  return ans;
}
int calc(int a, int b, int c) {
  a = ind[b][a];
  c = ind[b][c];
  if (a < c) return psum[b][c - 1] - psum[b][a];
  return psum[b].back() - psum[b][a] + (c ? psum[b][c - 1] : 0);
}
int main() {
  cin >> n >> m;
  while (m--) {
    int u = in(), v = in();
    g[v].push_back(u);
    g[u].push_back(v);
  }
  int best = 1;
  for (int i = 1; i <= n; i++) {
    if ((x[i] = in()) < x[best]) best = i;
    y[i] = in();
  }
  x[0] = x[best] - 1;
  y[0] = y[best];
  g[0].push_back(best);
  g[best].push_back(0);
  dfs(0);
  for (int i = 1; i <= n; i++) {
    center = i;
    sort(g[i].begin(), g[i].end(), cmp);
    for (int j = 0; j < g[i].size(); j++) {
      ind[i][g[i][j]] = j;
      psum[i].push_back(psum[i].size() ? psum[i].back() : 0);
      psum[i].back() += w[{i, g[i][j]}];
    }
  }
  for (int q = in(); q; q--) {
    vector<int> cs;
    for (int t = in(); t; t--) cs.push_back(in());
    int cnt = 0;
    if (area(cs) > 0) reverse(cs.begin(), cs.end());
    for (int i = 0; i < cs.size(); i++) {
      int x = calc(cs[i], cs[(i + 1) % cs.size()], cs[(i + 2) % cs.size()]);
      cnt += x;
    }
    assert(cnt >= cs.size());
    cout << cnt << "\n";
  }
}
