#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native,avx2")
using namespace std;
mt19937 mrnd(time(0));
const int INF = 1000000007;
const long long INF_LL = 1152921504606846977;
void solve() {
  int n, m;
  cin >> n >> m;
  vector<set<int>> g(n);
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    if (u > v) swap(u, v);
    g[u].insert(v);
  }
  set<int> dead;
  for (int i = 0; i < n; ++i) {
    if (!g[i].empty()) {
      dead.insert(i);
    }
  }
  int q;
  cin >> q;
  auto upd = [&](int node) {
    if (g[node].empty()) {
      dead.erase(node);
    } else {
      dead.insert(node);
    }
  };
  for (int i = 0; i < q; ++i) {
    int z, u, v;
    cin >> z;
    if (z == 1) {
      cin >> u >> v;
      --u, --v;
      if (u > v) swap(u, v);
      g[u].insert(v);
      upd(u), upd(v);
    } else if (z == 2) {
      cin >> u >> v;
      --u, --v;
      if (u > v) swap(u, v);
      g[u].erase(v);
      upd(u), upd(v);
    } else {
      cout << n - int(dead.size()) << '\n';
    }
  }
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(20);
  int tests = 1;
  while (tests--) {
    solve();
  }
}
