#include<bits/stdc++.h>
using namespace std;
#define task "task"
#define ii pair<int,int>
#define fi first
#define se second
//#define int long long
#define ll long long
#define ld double
#define mp make_pair
#define lg2 30
#define iii pair<int,ii>
#define iiii pair<ii,ii>
#define base 29
#define eps 1e-8
int dx[]= {0LL,0LL,1,-1,1,1,-1,-1};
int dy[]= {1,-1,0LL,0LL,1,-1,1,-1};
const int maxn=1e5+1,S=317;
const int mod=1e9+7;
int n,m,Q,mask[maxn],lab[maxn],vis[maxn],ans[maxn];
struct pt
{
    int u,v,d;
};
struct pt1
{
    int t,u,d;
};
pt a[maxn];
pt1 q[maxn];
stack<ii>roll;
void init()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i].u>>a[i].v>>a[i].d;
    }
    cin>>Q;
    for(int i=1;i<=Q;i++)
    {
        cin>>q[i].t>>q[i].u>>q[i].d;
    }
}
int acs(int u)
{
    return lab[u]<0?u:acs(lab[u]);
}
void join1(int u,int v,int type)
{
    u=acs(u),v=acs(v);
    if(u==v)return;
    if(lab[u]>lab[v])swap(u,v);
    if(type)roll.push({v,lab[v]});
    lab[u]+=lab[v];
    lab[v]=u;
}
void rollback()
{
    while(!roll.empty())
    {
        ii tmp=roll.top();
        roll.pop();
        lab[lab[tmp.fi]]-=tmp.se;
        lab[tmp.fi]=tmp.se;
    }
}
void process()
{
    for(int st=1;st<=Q;st+=S)
    {
        int en=min(Q,st+S-1);
        vector<int>tv2,no_join,join;
        for(int i=1;i<=en;i++)
        {
            if(q[i].t==1)
            {
                mask[q[i].u]=1;
            }
            else
            {
                tv2.push_back(i);
            }
        }
        for(int i=1;i<=m;i++)
        {
            if(!mask[i])
            {
                no_join.push_back(i);
            }
            else
            {
                join.push_back(i);
            }
        }
        sort(tv2.begin(),tv2.end(),[](const int &x,const int &y)-> bool
        {
            return q[x].d>q[y].d;
        });
        sort(no_join.begin(),no_join.end(),[](const int &x,const int &y)-> bool
        {
            return a[x].d>a[y].d;
        });
        memset(lab,-1,sizeof(lab));
        int j=0;
        for(int i=0;i<tv2.size();i++)
        {
            while(j<no_join.size()&&a[no_join[j]].d>=q[tv2[i]].d)
            {
                join1(a[no_join[j]].u,a[no_join[j]].v,0);
                j++;
            }
            for(int z=st;z<tv2[i];z++)
            {
                if(q[z].t==1)
                {
                    vis[q[z].u]=z;
                }
            }
            for(int x:join)
            {
                if(vis[x])
                {
                    if(q[vis[x]].d>=q[tv2[i]].d)
                    {
                        join1(a[x].u,a[x].v,1);
                    }
                }
                else
                {
                    if(a[x].d>=q[tv2[i]].d)
                    {
                        join1(a[x].u,a[x].v,1);
                    }
                }
            }
            ans[tv2[i]]=-lab[acs(q[tv2[i]].u)];
            rollback();
            for(int z=st;z<tv2[i];z++)
            {
                if(q[z].t==1)
                {
                    vis[q[z].u]=0;
                }
            }
        }
        for(int i=st;i<=en;i++)
        {
            if(q[i].t==1)
            {
                mask[q[i].u]=0;
                a[q[i].u].d=q[i].d;
            }
        }
    }
    for(int i=1;i<=Q;i++)
    {
        if(q[i].t==2)
        cout<<ans[i]<<'\n';
    }
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if(fopen(task".inp","r"))
    {
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    init();
    process();
    cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ;
}
Compilation message (stderr)
bridges.cpp: In function 'int main()':
bridges.cpp:170:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  170 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:171:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  171 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |