#include <bits/stdc++.h> #include <atcoder/all> // using mint = atcoder::static_modint<998244353>; // //using mint = atcoder::static_modint<1000000007>; using namespace std; using namespace atcoder; using ld = long double; using ll = long long; #define mp(a,b) make_pair(a,b) #define rep(i,s,n) for(int i=s; i<(int)n; i++) const vector<int> dx{1,0,-1,0},dy{0,1,0,-1}; int main(){ int n;cin >> n; int m;cin >> m; vector<ll> x(m),y(m); vector<set<int>> G(n); rep(i,0,m){ cin >> x[i] >> y[i]; x[i]--,y[i]--; G[x[i]].insert(y[i]); G[y[i]].insert(x[i]); } vector<ll> a(n);rep(i,0,n)cin >> a[i]; int Q;cin >> Q; vector<vector<ll>> queries(Q); rep(q,0,Q){ int t;cin >> t; if(t==1){ int u,v;cin >> u >> v; u--,v--; G[u].insert(v); G[v].insert(u); queries[q]={t,u,v}; } else if(t==2){ int p,a;cin >> p >> a; p--; queries[q]={t,p,a}; } else{ int c;cin >> c; c--; queries[q]={t,c}; } } vector<bool> is_large(n); rep(i,0,n){ if(G[i].size()>=500)is_large[i]=true; G[i].clear(); } vector<set<int>> largeneighbor(n); vector<ll> smallsum(n); rep(i,0,m){ G[x[i]].insert(y[i]); G[y[i]].insert(x[i]); if(is_large[x[i]])largeneighbor[y[i]].insert(x[i]); else smallsum[y[i]]+=a[x[i]]; if(is_large[y[i]])largeneighbor[x[i]].insert(y[i]); else smallsum[x[i]]+=a[y[i]]; } rep(q,0,Q){ int t=queries[q][0]; if(t==1){ int u=queries[q][1],v=queries[q][2]; if(G[u].find(v)==G[u].end()){ G[u].insert(v); G[v].insert(u); if(is_large[u])largeneighbor[v].insert(u); else smallsum[v]+=a[u]; if(is_large[v])largeneighbor[u].insert(v); else smallsum[u]+=a[v]; } else{ G[u].erase(v); G[v].erase(u); if(is_large[u])largeneighbor[v].erase(u); else smallsum[v]-=a[u]; if(is_large[v])largeneighbor[u].erase(v); else smallsum[u]-=a[v]; } } else if(t==2){ int p=queries[q][1],v=queries[q][2]; if(!is_large[p]){ for(auto x:G[p]){ smallsum[x]-=a[p]; smallsum[x]+=v; } } a[p]=v; } else{ int c=queries[q][1]; ll ans=smallsum[c]; for(auto x:largeneighbor[c])ans+=a[x]; cout << ans << "\n"; } } }