#include <bits/stdc++.h>
using namespace std;
struct edge {
  int a, b, v;
} e[500001];
char ch;
int i, j, k, n, m, tot, a[500001], res[500001], op[300001][3], cot, lim, ans,
    ts;
bool cmp(edge a, edge b) {
  return a.a < b.a || a.a == b.a && a.b < b.b ||
         a.a == b.a && a.b == b.b && a.v;
}
int bs(int x, int y) {
  int l, r, m;
  if (x > y) swap(x, y);
  if (e[cot].a < x || e[cot].a == x && e[cot].b < y) return -1;
  for (l = 1, r = cot; l < r - 1;) {
    m = (l + r) >> 1;
    if (e[m].a > x || e[m].a == x && e[m].b >= y)
      r = m;
    else
      l = m + 1;
  }
  if (e[l].a == x && e[l].b == y) return l;
  if (e[r].a == x && e[r].b == y) return r;
  return -1;
}
void work(int t1, int t2) {
  int i, k;
  memset(res, 0, sizeof(res));
  for (i = t1; i <= t2; i++) {
    if (op[i][0] == 0) a[op[i][1]] = 1;
    if (op[i][0] == 1) a[op[i][1]] = 0;
    if (op[i][0] == 2) {
      k = bs(op[i][1], op[i][2]);
      e[k].v = 1;
    }
    if (op[i][0] == 3) {
      k = bs(op[i][1], op[i][2]);
      e[k].v = 0;
    }
  }
  for (i = 1; i <= cot; i++) {
    if (!e[i].v) continue;
    if (a[e[i].a]) res[e[i].b]++;
    if (a[e[i].b]) res[e[i].a]++;
  }
}
int solve(int t1, int t2, int p) {
  int i, k, res = 0;
  for (i = t1; i <= t2; i++) {
    if (op[i][0] == 0) {
      a[op[i][1]] = 1;
      k = bs(p, op[i][1]);
      if (k != -1 && e[k].v) res++;
    }
    if (op[i][0] == 1) {
      a[op[i][1]] = 0;
      k = bs(p, op[i][1]);
      if (k != -1 && e[k].v) res--;
    }
    if (op[i][0] == 2) {
      if (op[i][1] != p && op[i][2] != p) continue;
      k = bs(op[i][1], op[i][2]);
      e[k].v = 1;
      if (a[(op[i][1] == p) ? op[i][2] : op[i][1]]) res++;
    }
    if (op[i][0] == 3) {
      if (op[i][1] != p && op[i][2] != p) continue;
      k = bs(op[i][1], op[i][2]);
      e[k].v = 0;
      if (a[(op[i][1] == p) ? op[i][2] : op[i][1]]) res--;
    }
  }
  for (i = t2; i >= t1; i--) {
    if (op[i][0] == 0) a[op[i][1]] = 0;
    if (op[i][0] == 1) a[op[i][1]] = 1;
    if (op[i][0] == 2) {
      if (op[i][1] != p && op[i][2] != p) continue;
      k = bs(op[i][1], op[i][2]);
      e[k].v = 0;
    }
    if (op[i][0] == 3) {
      if (op[i][1] != p && op[i][2] != p) continue;
      k = bs(op[i][1], op[i][2]);
      e[k].v = 1;
    }
  }
  return res;
}
int main() {
  scanf("%d%d%d", &n, &m, &tot);
  scanf("%d", &k);
  memset(a, 0, sizeof(a));
  for (i = 1; i <= k; i++) scanf("%d", &j), a[j] = 1;
  for (i = 1, cot = m; i <= m; i++) {
    scanf("%d%d", &e[i].a, &e[i].b);
    e[i].v = 1;
    if (e[i].a > e[i].b) swap(e[i].a, e[i].b);
  }
  for (i = 1; i <= tot; i++) {
    for (ch = getchar(); ch < 'A'; ch = getchar())
      ;
    if (ch == 'O') {
      op[i][0] = 0;
      scanf("%d", &op[i][1]);
    }
    if (ch == 'F') {
      op[i][0] = 1;
      scanf("%d", &op[i][1]);
    }
    if (ch == 'A') {
      op[i][0] = 2;
      cot++;
      scanf("%d%d", &e[cot].a, &e[cot].b);
      e[cot].v = 0;
      if (e[cot].a > e[cot].b) swap(e[cot].a, e[cot].b);
      op[i][1] = e[cot].a;
      op[i][2] = e[cot].b;
    }
    if (ch == 'D') {
      op[i][0] = 3;
      scanf("%d%d", &op[i][1], &op[i][2]);
    }
    if (ch == 'C') {
      op[i][0] = 4;
      scanf("%d", &op[i][1]);
    }
  }
  sort(e + 1, e + 1 + cot, cmp);
  lim = ceil(sqrt(tot));
  ts = 0;
  for (i = 1; i <= tot; i++) {
    if (i % lim == 1) work(ts + 1, i), ts = i;
    if (op[i][0] < 4) continue;
    ans = res[op[i][1]] + solve(ts + 1, i - 1, op[i][1]);
    printf("%d\n", ans);
  }
  return 0;
}
