#include <bits/stdc++.h>
using namespace std;
const int INF = (int)2e9;
const long long INFL = (long long)9e18;
const int MAXINT = ((~0) ^ (1 << 31));
const long long MAXLL = ((~0) ^ ((long long)1 << 63));
template <class T>
inline T pow2(T a) {
  return a * a;
}
template <class T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, true) : false;
}
template <class T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, true) : false;
}
bool debug = 0;
const int maxn = (int)1e5 + 10;
;
struct edge {
  int x, flow;
  long double ang;
  edge(int a = 0) {
    x = a;
    flow = 0;
    ang = 0;
  }
  bool operator<(const edge& b) const { return ang < b.ang; }
};
int n, m, q;
pair<int, int> pos[maxn];
vector<edge> adj[maxn];
bool visited[maxn];
int dfs(int v, int par) {
  int ans = 0, pr = -1;
  visited[v] = true;
  for (int i = 0; i < (int)(adj[v].size()); i++) {
    int u = adj[v][i].x;
    if (u == par) {
      pr = i;
      continue;
    }
    if (!visited[u]) ans += adj[v][i].flow = dfs(u, v);
  }
  if (debug) cout << "dfs:  " << v << " " << pr << " " << ans << endl;
  if (pr != -1) adj[v][pr].flow = -ans + 1;
  return ans - 1;
}
void checkdfs() {
  for (int i = 0; i < (int)(n + 1); i++) {
    cout << "flow: " << i << " : " << endl;
    for (int j = 0; j < (int)(adj[i].size()); j++) {
      cout << adj[i][j].x << " " << adj[i][j].flow << endl;
    }
  }
}
map<int, int> getid[maxn];
void sortedge(int v) {
  for (int i = 0; i < (int)(adj[v].size()); i++) {
    int u = adj[v][i].x;
    adj[v][i].ang =
        atan2(pos[u].second - pos[v].second, pos[u].first - pos[v].first);
  }
  sort(adj[v].begin(), adj[v].end());
  for (int i = 1; i < (int)(adj[v].size()); i++) {
    adj[v][i].flow += adj[v][i - 1].flow;
  }
  for (int i = 0; i < (int)(adj[v].size()); i++) {
    if (debug) cout << "id: " << v << " " << adj[v][i].x << " " << i << endl;
    getid[v][adj[v][i].x] = i;
  }
  if (debug) {
    cout << "ang : " << v << " : ";
    for (int i = 0; i < (int)(adj[v].size()); i++) cout << adj[v][i].x << " ";
    cout << endl;
  }
}
long double area(vector<int>& v) {
  long double ans = 0;
  int n = v.size();
  for (int i = 0; i < (int)(n); i++) {
    int x = v[i];
    int y = v[(i + 1) % n];
    ans += (long long)(pos[x].first + pos[y].first) *
           (pos[y].second - pos[x].second);
  }
  return ans;
}
int range(int v, int l, int r) {
  if (debug) cout << "range : " << v << " " << l << " " << r << endl;
  if (l <= r) {
    return adj[v][r - 1].flow - adj[v][l].flow;
  } else {
    return adj[v].back().flow - adj[v][l].flow + (r ? adj[v][r - 1].flow : 0);
  }
  return 0;
}
int solve(vector<int>& v) {
  int n = v.size();
  int ans = 0;
  for (int i = 0; i < (int)(n); i++) {
    int pr = (i - 1 + n) % n;
    int nx = (i + 1) % n;
    if (debug) cout << "solve " << v[i] << " " << v[pr] << " " << v[nx] << endl;
    ans += range(v[i], getid[v[i]][v[pr]], getid[v[i]][v[nx]]);
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < (int)(m); i++) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back(edge(b));
    adj[b].push_back(edge(a));
  }
  for (int i = 1; i < (int)(n + 1); i++) cin >> pos[i].first >> pos[i].second;
  pos[0].first = pos[0].second = -INF;
  int v = min_element(pos + 1, pos + n + 1) - (pos);
  if (debug) cout << "min element : " << v << endl;
  adj[0].push_back(edge(v));
  adj[v].push_back(edge(0));
  dfs(0, -1);
  if (debug) checkdfs();
  for (int i = 0; i < (int)(n + 1); i++) sortedge(i);
  if (debug) checkdfs();
  cin >> q;
  for (int i = 0; i < (int)(q); i++) {
    int sz;
    vector<int> v;
    cin >> sz;
    for (int j = 0; j < (int)(sz); j++) {
      int a;
      cin >> a;
      v.push_back(a);
    }
    if (debug) {
      cout << "area : " << i << " " << area(v) << endl;
    }
    if (area(v) < 0) reverse(v.begin(), v.end());
    cout << solve(v) << "\n";
  }
}
