#include <bits/stdc++.h>
using namespace std;
struct Edge {
int u, v, d;
};
struct Query {
int s, w, id;
};
int p[500005], sz[500005];
int find_set(int v) {
if (p[v] == v) return v;
return p[v] = find_set(p[v]);
}
void unite(int a, int b) {
a = find_set(a);
b = find_set(b);
if (a == b) return;
if (sz[a] < sz[b]) swap(a, b);
p[b] = a;
sz[a] += sz[b];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<Edge> edges(m);
for (int i = 0; i < m; i++) {
cin >> edges[i].u >> edges[i].v >> edges[i].d;
}
int q;
cin >> q;
vector<Query> queries;
queries.reserve(q);
for (int i = 0; i < q; i++) {
int t, s, w;
cin >> t >> s >> w;
queries.push_back({s, w, i});
}
sort(edges.begin(), edges.end(), [&](Edge a, Edge b) {
return a.d > b.d;
});
sort(queries.begin(), queries.end(), [&](Query a, Query b) {
return a.w > b.w;
});
for (int i = 1; i <= n; i++) {
p[i] = i;
sz[i] = 1;
}
vector<int> ans(q);
int j = 0;
for (auto qu : queries) {
while (j < m && edges[j].d >= qu.w) {
unite(edges[j].u, edges[j].v);
j++;
}
ans[qu.id] = sz[find_set(qu.s)];
}
for (int i = 0; i < q; i++) {
cout << ans[i] << '\n';
}
return 0;
}