#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
int N, M, Q;
vector<int> V[100002], W[100002];
int X[100002], Y[100002], T[100002], weight[100002];
int A[100002];
bool S[100002];
int xglob, yglob;
inline bool compare(const int& i1, const int& i2) {
  return atan2(Y[i1] - yglob, X[i1] - xglob) <
         atan2(Y[i2] - yglob, X[i2] - xglob);
}
void Dfs(int x) {
  S[x] = true;
  weight[x] = 1;
  W[x].resize(V[x].size());
  for (int i = 0; i < int(V[x].size()); ++i)
    if (!S[V[x][i]]) {
      T[V[x][i]] = x;
      Dfs(V[x][i]);
      weight[x] += weight[V[x][i]];
      W[x][i] = -weight[V[x][i]];
    }
  for (int i = 0; i < int(V[x].size()); ++i)
    if (V[x][i] == T[x]) W[x][i] = weight[x];
  for (int i = 1; i < int(W[x].size()); ++i) W[x][i] += W[x][i - 1];
}
int main() {
  cin >> N >> M;
  for (int i = 1, nod1, nod2; i <= M; ++i) {
    cin >> nod1 >> nod2;
    V[nod1].push_back(nod2);
    V[nod2].push_back(nod1);
  }
  int minx = -1;
  for (int i = 1; i <= N; ++i) {
    cin >> X[i] >> Y[i];
    if (minx == -1 || X[i] < X[minx]) minx = i;
  }
  X[N + 1] = -0x3f3f3f3f, Y[N + 1] = -0x3f3f3f3f;
  V[minx].push_back(N + 1);
  V[N + 1].push_back(minx);
  for (int i = 1; i <= N; ++i) {
    xglob = X[i], yglob = Y[i];
    sort(V[i].begin(), V[i].end(), compare);
  }
  Dfs(N + 1);
  cin >> Q;
  for (int i = 1; i <= Q; ++i) {
    cin >> A[0];
    long long area = 0;
    for (int j = 1; j <= A[0]; ++j) {
      cin >> A[j];
      if (j >= 2)
        area += 1LL * X[A[j - 1]] * Y[A[j]] - 1LL * X[A[j]] * Y[A[j - 1]];
    }
    area += 1LL * X[A[A[0]]] * Y[A[1]] - 1LL * X[A[1]] * Y[A[A[0]]];
    if (area < 0) reverse(A + 1, A + A[0] + 1);
    A[A[0] + 1] = A[1];
    ++A[0];
    A[A[0] + 1] = A[2];
    ++A[0];
    int result = 0;
    for (int j = 2; j <= A[0] - 1; ++j) {
      int step = 1 << 16, nod1, nod2;
      for (nod1 = -1; step; step >>= 1)
        if (nod1 + step < int(V[A[j]].size()) &&
            atan2(Y[V[A[j]][nod1 + step]] - Y[A[j]],
                  X[V[A[j]][nod1 + step]] - X[A[j]]) -
                    atan2(Y[A[j - 1]] - Y[A[j]], X[A[j - 1]] - X[A[j]]) <
                eps)
          nod1 += step;
      step = 1 << 16;
      for (nod2 = -1; step; step >>= 1)
        if (nod2 + step < int(V[A[j]].size()) &&
            atan2(Y[V[A[j]][nod2 + step]] - Y[A[j]],
                  X[V[A[j]][nod2 + step]] - X[A[j]]) -
                    atan2(Y[A[j + 1]] - Y[A[j]], X[A[j + 1]] - X[A[j]]) <
                eps)
          nod2 += step;
      if (nod1 < nod2)
        result += W[A[j]][nod2 - 1] - W[A[j]][nod1];
      else
        result += W[A[j]][W[A[j]].size() - 1] -
                  (W[A[j]][nod1] - (nod2 == 0 ? 0 : W[A[j]][nod2 - 1]));
    }
    cout << result << '\n';
  }
}
