#include <bits/stdc++.h> using namespace std; using ll = long long; const int INF = 1e9 + 10; const ll INFL = 4e18; int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int N, M; cin >> N >> M; vector<unordered_set<int>> G(N); for (int i = 0; i < M; i++) { int u, v; cin >> u >> v; u--, v--; G[u].insert(v), G[v].insert(u); } vector<ll> A(N); for (int i = 0; i < N; i++) cin >> A[i]; vector<ll> sum(N); for (int i = 0; i < N; i++) for (int j : G[i]) sum[i] += A[j]; int Q; cin >> Q; // const int B=sqrt(max(N,M)+Q); const int B = 450; vector<tuple<int, int, int>> qs(Q); vector<int> qv; qv.reserve(1000); for (int qb = 0; qb * B < Q; qb++) { int q = min(Q, (qb + 1) * B) - qb * B; qv.clear(); for (int i = 0; i < q; i++) { int t; cin >> t; if (t == 1) { int u, v; cin >> u >> v; u--, v--; qs[qb * B + i] = {t, u, v}; } else if (t == 2) { int p, a; cin >> p >> a; p--; qs[qb * B + i] = {t, p, a}; } else { int c; cin >> c; c--; qs[qb * B + i] = {t, c, -1}; qv.push_back(c); } } ranges::sort(qv); qv.erase(unique(qv.begin(), qv.end()), qv.end()); for (int i = 0; i < q; i++) { int t = get<0>(qs[qb * B + i]); if (t == 1) { auto [t, u, v] = qs[qb * B + i]; if (G[u].count(v)) { G[u].erase(v), G[v].erase(u); sum[u] -= A[v], sum[v] -= A[u]; } else { G[u].insert(v), G[v].insert(u); sum[u] += A[v], sum[v] += A[u]; } } else if (t == 2) { auto [t, p, a] = qs[qb * B + i]; for (int v : qv) { if (G[p].count(v)) { sum[v] -= A[p]; sum[v] += a; } } A[p] = a; } else { auto [t, c, _] = qs[qb * B + i]; cout << sum[c] << '\n'; } } for (int i = 0; i < N; i++) { sum[i] = 0; for (int j : G[i]) sum[i] += A[j]; } } }