#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];
        }
    }
}