/**
* author: Vi Gia Huy
* Vi Gia Huy will win APIO
**/
#include <bits/stdc++.h>
using namespace std;
const long long INF = (1ll<<60);
const int N = 5e4 + 3;
const int Q = 1e5 + 6;
int n, m, q;
struct Node {
int to;
long long d;
int id;
};
vector<Node> adj[N];
struct Query {
int type;
int b;
long long r;
int s;
long long w;
} qu[Q];
namespace sub1 {
bool check[N];
int dfs(int u, long long w) {
int res = 1;
for (Node it : adj[u]) {
int v = it.to;
long long d = it.d;
if (check[v]) continue;
if (w <= d) {
check[v] = true;
res += dfs(v, w);
}
}
return res;
}
void sol() {
for (int qi = 1; qi <= q; qi++) {
if (qu[qi].type == 1) {
for (int i = 1; i <= n; i++) {
for (Node& it : adj[i]) {
if (it.id == qu[qi].b) {
it.d = qu[qi].r;
}
}
}
}
else {
for (int i = 1; i <= n; i++) check[i] = false;
check[qu[qi].s] = true;
int res = dfs(qu[qi].s, qu[qi].w);
cout << res << "\n";
}
}
return;
}
}
namespace sub2 {
long long st[4 * N];
void update(int id, int l, int r, int pos, long long val) {
if (r < pos || pos < l) return;
if (l == r) {
st[id] = val;
return;
}
int mid = (l + r) / 2;
update(2 * id, l, mid, pos, val);
update(2 * id + 1, mid + 1, r, pos, val);
st[id] = min(st[2 * id], st[2 * id + 1]);
return;
}
long long get(int id, int l, int r, int u, int v) {
if (v < l || r < u) return INF;
if (u <= l && r <= v) return st[id];
int mid = (l + r ) / 2;
return min(get(2 * id, l, mid, u, v), get(2 * id + 1, mid + 1, r, u, v));
}
void sol() {
for (int i = 1; i < 4 * N; i++) st[i] = INF;
for (int i = 1; i < n; i++) {
for (Node it : adj[i]) {
if (it.to == i + 1) {
update(1, 1, n, i, it.d);
}
}
}
for (int qi = 1; qi <= q; qi++) {
if (qu[qi].type == 1) {
update(1, 1, n, qu[qi].b, qu[qi].r);
}
else {
long long w = qu[qi].w;
int s = qu[qi].s;
long long res = 1;
int l = 1;
int r = n - s;
int cnt = 0;
while (l <= r) {
int mid = (l + r) / 2;
int v = s + mid - 1;
long long mn = get(1, 1, n, s, v);
if (w <= mn) {
l = mid + 1;
cnt = mid;
}
else r = mid - 1;
}
res += cnt;
cnt = 0;
l = 1;
r = s - 1;
while (l <= r) {
int mid = (l + r) / 2;
int v = s - mid;
long long mn = get(1, 1, n, v, s - 1);
if (w <= mn) {
l = mid + 1;
cnt = mid;
}
else r = mid - 1;
}
res += cnt;
cout << res << "\n";
}
}
return;
}
}
namespace sub3 {
int sz[N];
long long mn[N];
long long f[N];
void pull(int u) {
mn[u] = INF;
int v1 = 2 * u;
int v2 = 2 * u + 1;
if (v1 <= n) {
mn[u] = min({mn[u], f[v1], mn[v1]});
}
if (v2 <= n) {
mn[u] = min({mn[u], f[v2], mn[v2]});
}
}
void dfs(int u) {
sz[u] = 1;
mn[u] = INF;
int v1 = 2 * u;
int v2 = 2 * u + 1;
if (v1 <= n) {
dfs(v1);
sz[u] += sz[v1];
}
if (v2 <= n) {
dfs(v2);
sz[u] += sz[v2];
}
pull(u);
return;
}
int query(int u, long long w) {
if (w <= mn[u]) return sz[u];
int res = 1;
int v1 = 2 * u;
int v2 = 2 * u + 1;
if (v1 <= n && f[v1] >= w) {
res += query(v1, w);
}
if (v2 <= n && f[v2] >= w) {
res += query(v2, w);
}
return res;
}
void sol() {
for (int u = 1; u <= n; u++) {
for (Node it : adj[u]) {
int v = it.to;
long long d = it.d;
if (v > u) {
f[v] = d;
}
}
}
dfs(1);
for (int qi = 1; qi <= q; qi++) {
if (qu[qi].type == 1) {
int u = qu[qi].b + 1;
f[u] = qu[qi].r;
u /= 2;
while (u >= 1) {
long long tmp = mn[u];
pull(u);
if (tmp == mn[u]) break;
u /= 2;
}
}
else {
int u = qu[qi].s;
long long w = qu[qi].w;
while (u > 1 && f[u] >= w) {
u /= 2;
}
cout << query(u, w) << "\n";
}
}
return;
}
}
namespace sub4 {
void sol() {
return;
}
}
namespace sub5 {
void sol() {
return;
}
}
namespace sub6 {
void sol() {
return;
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
bool checksub2 = true;
bool checksub3 = false;
bool checksub4 = true;
int tmp = 1;
for (int k = 1; k <= 15; k++) {
tmp *= 2;
if (n == tmp - 1) checksub3 = true;
}
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
long long d; cin >> d;
adj[u].push_back({v, d, i});
adj[v].push_back({u, d, i});
if (u != i || v != i + 1) checksub2 = false;
if (u != (i + 1) / 2 || v != i + 1) checksub3 = false;
}
cin >> q;
for (int i = 1; i <= q; i++) {
cin >> qu[i].type;
if (qu[i].type == 1) cin >> qu[i].b >> qu[i].r;
else cin >> qu[i].s >> qu[i].w;
if (qu[i].type == 1) checksub4 = false;
}
sub3::sol();
return 0;
}