#include "bits/stdc++.h"
using namespace std;
using ll = long long;
struct dsu {
vector<int> p;
vector<int> sz;
vector<pair<int&, int>> chg;
vector<int> t;
dsu(int n) {
p.resize(n);
std::iota(p.begin(), p.end(), 0);
sz.resize(n, 1);
}
void clear() {
chg.clear(); t.clear();
std::iota(p.begin(), p.end(), 0);
std::fill(sz.begin(), sz.end(), 1);
}
void save() {
t.push_back(chg.size());
}
void rollback() {
while (chg.size() > t.back()) {
chg.back().first = chg.back().second;
chg.pop_back();
}
t.pop_back();
}
int get(int v) {
return v == p[v] ? v : get(p[v]);
}
void merge(int v, int u) {
v = get(v), u = get(u);
if (v != u) {
if (sz[v] > sz[u]) swap(v, u);
chg.push_back({sz[u], sz[u]});
chg.push_back({p[v], p[v]});
p[v] = u;
sz[u] += sz[v];
}
}
};
const int K = 400;
void solve () {
int n, m;
cin >> n >> m;
dsu dsu(n);
vector<array<int, 3>> edges(m);
for (auto& [x, y, w] : edges) {
cin >> x >> y >> w;
x--, y--;
}
int q; cin >> q;
vector<array<int, 3>> Q(q);
for (auto& [x, y, z] : Q) {
cin >> x >> y >> z;
y--;
}
vector<int> ans(q, 0), ban(m); int T = 0;
for (int l = 0; l < q; l += K) {
int r = min(q, l + K);
dsu.clear();
set<int> special;
vector<array<int, 3>> cur_Q;
for (int i = l; i < r; i++) {
if (Q[i][0] == 1) {
special.insert(Q[i][1]);
} else {
cur_Q.push_back({Q[i][2], Q[i][1], i});
}
}
vector<array<int, 3>> cur_edges;
for (int i = 0; i < m; i++) {
if (special.find(i) == special.end()) {
cur_edges.push_back({edges[i][2], edges[i][0], edges[i][1]});
}
}
std::sort(cur_edges.begin(), cur_edges.end());
std::reverse(cur_edges.begin(), cur_edges.end());
int uk = 0;
std::sort(cur_Q.begin(), cur_Q.end());
std::reverse(cur_Q.begin(), cur_Q.end());
for (auto& [w, v, qi] : cur_Q) {
while (uk < cur_edges.size() && cur_edges[uk][0] >= w) {
dsu.merge(cur_edges[uk][1], cur_edges[uk][2]);
uk++;
}
T++;
vector<pair<int, int>> add;
for (int i = qi; i >= l; i--) {
if (Q[i][0] == 1) {
int j = Q[i][1];
if (ban[j] != T) {
ban[j] = T;
if (Q[i][2] >= w) {
add.push_back({edges[j][0], edges[j][1]});
}
}
}
}
for (auto& j : special) {
if (ban[j] != T) {
if (edges[j][2] >= w) {
add.push_back({edges[j][0], edges[j][1]});
}
}
}
dsu.save();
for (auto& [x, y] : add) {
dsu.merge(x, y);
}
ans[qi] = dsu.sz[dsu.get(v)];
dsu.rollback();
}
for (int i = l; i < r; i++) {
if (Q[i][0] == 1) {
edges[Q[i][1]][2] = Q[i][2];
} else {
}
}
}
for (auto& x : ans) {
if (x) {
cout << x << '\n';
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}