#include<bits/stdc++.h>
using namespace std;
#define PB push_back
const int sq = 350;
int n,m,q;
// dsu
int l[50005],sz[50005];
stack<int> stk;
void reset()
{
iota(l + 1, l + 1 + n, 1);
fill(sz + 1, sz + 1 + n, 1);
}
int fi(int idx)
{
while(l[idx] != idx) idx = l[idx];
return idx;
}
void uni(int a,int b)
{
a = fi(a), b = fi(b);
if(a == b) return ;
if(sz[a] > sz[b]) swap(a,b);
stk.push(a);
sz[b] += sz[a];
l[a] = l[b];
}
void rollback(int x)
{
while(stk.size() > x)
{
int a = stk.top();
stk.pop();
sz[l[a]] -= sz[a];
l[a] = a;
}
}
int u[100005],v[100005],w[100005];
int ty[100005],x[100005],y[100005],ans[100005];
bool chg[100005];
vector<int> to_join[sq];
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d %d %d",&u[i],&v[i],&w[i]);
scanf("%d",&q);
for(int i=1;i<=q;i++)
scanf("%d %d %d",&ty[i],&x[i],&y[i]);
for(int l = 1; l <= q; l += sq)
{
int r = min(q + 1, l + sq);
reset();
fill(chg + 1, chg + 1 + m, false);
vector<int> ask, upd, unchg;
for(int i = l; i < r; i++)
{
if(ty[i] == 1)
{
chg[x[i]] = true;
upd.PB(i);
}
else
ask.PB(i);
}
for(int i = 1; i <= m;i++)
if(!chg[i])
unchg.PB(i);
for(int i = l; i < r; i++)
{
if(ty[i] == 1)
w[x[i]] = y[i];
else
{
to_join[i - l].clear();
for(int j: upd)
if(w[x[j]] >= y[i])
to_join[i - l].PB(x[j]);
}
}
sort(ask.begin(), ask.end(), [&](int a,int b) { return y[a] > y[b]; } );
sort(unchg.begin(), unchg.end(), [&](int a,int b) { return w[a] > w[b]; });
int ptr = 0;
for(int i: ask)
{
while(ptr < unchg.size() && w[unchg[ptr]] >= y[i])
{
uni(u[unchg[ptr]], v[unchg[ptr]]);
ptr++;
}
int prev_sz = stk.size();
for(int j: to_join[i - l])
uni(u[j], v[j]);
ans[i] = sz[fi(x[i])];
rollback(prev_sz);
}
}
for(int i = 1; i <= q; i++)
if(ty[i] == 2)
printf("%d\n",ans[i]);
}