#include #include #include #include #include #include using namespace atcoder; using namespace std; using ll = long long; using ull = unsigned long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; ll ll_min = numeric_limits::min(); ll ll_max = numeric_limits::max(); ll ALPHABET_N = 26; // using mint = modint998244353; // using mint = modint1000000007; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define all(a) a.begin(), a.end() using i128 = __int128_t; int main() { ll n, m; cin >> n >> m; vector U(n), V(n); rep(i, m) { cin >> U[i] >> V[i]; U[i]--; V[i]--; } ll q; cin >> q; vector Q(q), A(q), B(q); set bst; rep(i, q) { cin >> Q[i] >> A[i] >> B[i]; A[i]--; B[i]--; if (Q[i] == 2) bst.insert(A[i]); } set> follow_st; rep(i, m) { ll u = U[i], v = V[i]; if (bst.count(V[i])) { follow_st.insert({U[i], V[i]}); } } map open; ll ans_ = n - follow_st.size(); rep(i, q) { ll q = Q[i]; ll a = A[i]; ll b = B[i]; if (q == 1) { if (bst.count(b)) { if (follow_st.count({a, b})) { follow_st.erase({a, b}); } else { follow_st.insert({a, b}); } } } else { if (!open.count(a) || open[a]) { open[a] = false; } else { open[a] = true; } } ll ans = n - 1; for (auto b : bst) { if (b == a) continue; if (open.count(b) && !open[b] && !follow_st.count({a, b})) { ans--; } } cout << ans << endl; } return 0; }