// 第二题 我记得很久很久很久以前看过这样的题目,忘记是哪的区域赛了
// 记得有人说和节点度数有关,我记不清了,反正当时完全不懂
// 然后我想了想,估计就是更新节点度数有关,YY出来可能只要更新相邻节点度数更大或更小的就可以了
// 复杂度不知道多少,就是提交了试试,15MS就过了
// 看来就是这样了
// 具体就是求出每个节点度数,然后每次更新时,只要更新与自己相连,但度数比自己大的
// 查询时把度数自己大的节点累加的值加上就可输出,具体看代码比较清楚
// 也就做得来这2题了(见识少,以前题目做得少)。
// 不过在厦门实训感觉蛮悠闲,企业上课就是比学校效率
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
#define LL long long
#define N 100010
#define mod 1000000007
vector<int> V[N],up[N];//V记录边,up记录邻接节点,但度数自己大
int in[N];//记录节点度数
int sum[N],add[N];//add 保存更新
int main()
{
// priority_queue<int,vector<int>,greater<int> >
int T;
int n,m,Q;
int a,b;
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
for(i=;i<=n;i++){
V[i].clear();
in[i]=;
up[i].clear();
sum[i]=add[i]=;
}
while(m--)
{
scanf("%d %d",&a,&b);
V[a].push_back(b);
V[b].push_back(a);
in[b]++;
in[a]++;
} for(a=;a<=n;a++)
for(j=;j<V[a].size();j++)
{
b=V[a][j];
if(in[b]>=in[a])
up[a].push_back(b);
}
scanf("%d",&Q);
int cmd,u,v;
while(Q--)
{
scanf("%d %d",&cmd,&u);
if(cmd==)
{
scanf("%d",&v);
add[u]+=v;
for(i=; i<up[u].size(); i++)
{
j=up[u][i];
sum[j]+=v;
}
}
else
{
int ans=sum[u];
for(i=; i<up[u].size(); i++)
{
j=up[u][i];
if(in[j]!=in[u])
ans+=add[j];
}
printf("%d\n",ans);
}
} }
return ;
}