#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int mxn=1e5+5;
const int inf=1e9;
int n,m;
int L[mxn];
int R[mxn];
int W[mxn];
int vis[mxn]={};
vector<int> v;
int parent[mxn];
int sz[mxn];
vector<int> adj[mxn];
int block=400;
int findrep(int u) {
return parent[u]==u ? u : (parent[u]=findrep(parent[u]));
}
void unite(int u,int v) {
u=findrep(u);
v=findrep(v);
if(sz[u]>sz[v]) swap(u,v);
if(u!=v) {
parent[u]=v;
sz[v]+=sz[u];
}
}
struct query {
int u,w,id,t,id2;
query(int _,int __,int ___,int ____,int qind) : u(_), w(__), id(___),t(____),id2(qind) {};
};
int dfs(int cur,int k) {
vis[cur]=k;
int ans=sz[cur];
for(int u:adj[cur]) {
if(vis[u]!=k) {
ans+=dfs(u,k);
}
}
return ans;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
int U,V,d;
scanf("%d%d%d",&U,&V,&d);
L[i]=U;
R[i]=V;
W[i]=d;
v.push_back(i);
}
int q;
scanf("%d",&q);
vector<query> Q;
int K=0;
for(int i=1;i<=q;i++) {
int t,u,w;
scanf("%d%d%d",&t,&u,&w);
K+=t-1;
Q.push_back(query(u,w,i,t,K));
}
int res[mxn];
int mq[mxn]={};
int dontuse[mxn]={};
for(int i=1;i<=m;i++)mq[i]=W[i];
int vin=1;
for(int i=0;i<q;i+=block) {
sort(v.begin(),v.end(),[](int a,int b) {
return W[a]>W[b];
});
for(int j=1;j<=n;j++) {
parent[j]=j;
sz[j]=1;
}
vector<query> cur1;
vector<query> cur2;
for(int j=i;j<min(q,i+block);j++) {
if(Q[j].t==1) {
dontuse[Q[j].u]=1;
cur2.push_back(Q[j]);
}
else cur1.push_back(Q[j]);
}
sort(cur1.begin(),cur1.end(),[](query a,query b) {
return a.w > b.w;
});
int lp=0;
for(int j=0;j<cur1.size();j++) {
while(lp<m && W[v[lp]]>=cur1[j].w) {
if(dontuse[v[lp]]!=1) {
unite(L[v[lp]],R[v[lp]]);
}
lp++;
}
for(int k=0;k<cur2.size();k++) {
if(cur2[k].id > cur1[j].id ) break;
mq[cur2[k].u]=cur2[k].w;
}
for(int k=0;k<cur2.size();k++) {
if(mq[cur2[k].u]>=cur1[j].w) {
int u=L[cur2[k].u];
int v=R[cur2[k].u];
u=findrep(u);
v=findrep(v);
adj[u].push_back(v);
adj[v].push_back(u);
}
}
int tm=dfs(findrep(cur1[j].u),vin++);
res[cur1[j].id2]=tm;
for(int k=0;k<cur2.size();k++) {
if(mq[cur2[k].u]>=cur1[j].w) {
int u=L[cur2[k].u];
int v=R[cur2[k].u];
u=findrep(u);
v=findrep(v);
adj[u].clear();
adj[v].clear();
}
mq[cur2[k].u]=W[cur2[k].u];
}
}
for(int j=0;j<cur2.size();j++) {
W[cur2[j].u]=mq[cur2[j].u]=cur2[j].w;
dontuse[cur2[j].u]=0;
}
}
for(int i=1;i<=K;i++)cout<<res[i]<<endl;
}