#include <bits/stdc++.h>
using namespace std;
struct SegTree {
int n;
vector<int> seg;
void init(int _n) {
n = _n;
seg.assign(4 * n + 5, (int)1e9);
}
void build(int v, int l, int r, vector<int>& a) {
if (l == r) {
seg[v] = a[l];
return;
}
int mid = (l + r) / 2;
build(2 * v, l, mid, a);
build(2 * v + 1, mid + 1, r, a);
seg[v] = min(seg[2 * v], seg[2 * v + 1]);
}
void update(int v, int l, int r, int pos, int val) {
if (l == r) {
seg[v] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid) update(2 * v, l, mid, pos, val);
else update(2 * v + 1, mid + 1, r, pos, val);
seg[v] = min(seg[2 * v], seg[2 * v + 1]);
}
int query(int v, int l, int r, int a, int b) {
if (a > b) return (int)1e9;
if (l == a && r == b) return seg[v];
int mid = (l + r) / 2;
if (b <= mid) return query(2 * v, l, mid, a, b);
if (a > mid) return query(2 * v + 1, mid + 1, r, a, b);
return min(query(2 * v, l, mid, a, mid),
query(2 * v + 1, mid + 1, r, mid + 1, b));
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 1; i <= m; i++) {
int u, v, d;
cin >> u >> v >> d;
a[i] = d;
}
SegTree seg;
if (m > 0) {
seg.init(m);
seg.build(1, 1, m, a);
}
int q;
cin >> q;
while (q--) {
int t;
cin >> t;
if (t == 1) {
int b, r;
cin >> b >> r;
if (m > 0) seg.update(1, 1, m, b, r);
} else {
int s, w;
cin >> s >> w;
int L = s, R = s;
int lo = 1, hi = s;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (mid == s || seg.query(1, 1, m, mid, s - 1) >= w) {
L = mid;
hi = mid - 1;
} else {
lo = mid + 1;
}
}
lo = s, hi = n;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (mid == s || seg.query(1, 1, m, s, mid - 1) >= w) {
R = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
}
cout << R - L + 1 << '\n';
}
}
return 0;
}