#include <bits/stdc++.h>
using namespace std;
#define Long long long
#define bint __int128
#define _3bkarm cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
struct DSU {
vector<int> parent, count;
void init(int n) {
count.assign(n, 1), parent.assign(n, 0);
for (int i = 0; i < n; ++i) parent[i] = i;
}
int root(int u) {
while (u != parent[u])
u = parent[u] = parent[parent[u]];
return u;
}
void merge(int u, int v) {
int uroot = root(u), vroot = root(v);
if (uroot == vroot) return;
if (count[uroot] < count[vroot]) swap(uroot, vroot);
count[uroot] += count[vroot], parent[vroot] = uroot;
}
};
void getShitDone() {
int n, m;
cin >> n >> m;
vector< vector< array<int, 2> > > adj(m);
for (int i = 0, u, v, c; i < m; ++i) {
cin >> u >> v >> c; --u, --v, --c;
adj[c].push_back({ u, v });
}
int q;
cin >> q;
int sq = sqrt(q) + 1;
vector<int> ans(q);
vector< vector< pair<int, int> > > with(n);
for (int i = 0, u, v; i < q; ++i) {
cin >> u >> v; --u, --v;
if (u > v) swap(u, v);
with[u].push_back({ v, i });
}
int countBig = 0;
vector<int> mp(n, -1);
vector< vector< pair<int, int> > > big;
for (int i = 0; i < n; ++i) {
if ( with[i].size() > sq ) {
mp[i] = countBig++, big.push_back({});
for (auto [u, id] : with[i]) {
if ( with[u].size() > sq ) {
big.back().push_back({ u, id });
} else if (u > i) {
with[u].push_back({ i, id });
}
}
}
}
vector<int> vis(n);
DSU solve; solve.init(n);
for (int i = 0, vid = 1; i < m; ++i, ++vid) {
if ( adj[i].empty() ) continue;
vector<int> nodes;
for (auto [u, v] : adj[i]) {
solve.merge(u, v);
if (vis[u] != vid)
vis[u] = vid, nodes.push_back(u);
if (vis[v] != vid)
vis[v] = vid, nodes.push_back(v);
}
for (int v : nodes) {
if ( with[v].size() <= sq ) {
for (auto [u, id] : with[v])
if ( solve.root(u) == solve.root(v) ) ++ans[id];
} else {
for (auto [u, id] : big[ mp[v] ])
if ( solve.root(u) == solve.root(v) ) ++ans[id];
}
}
for (int v : nodes)
solve.parent[v] = v, solve.count[v] = 1;
}
for (int i = 0; i < q; ++i) cout << ans[i] << '\n';
}
signed main() {
_3bkarm
int ts = 1;
// cin >> ts;
while (ts--) getShitDone();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBMb25nIGxvbmcgbG9uZwojZGVmaW5lIGJpbnQgX19pbnQxMjgKI2RlZmluZSBfM2JrYXJtIGNpbi50aWUoTlVMTCk7IGNvdXQudGllKE5VTEwpOyBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgpzdHJ1Y3QgRFNVIHsKICAgIHZlY3RvcjxpbnQ+IHBhcmVudCwgY291bnQ7CgogICAgdm9pZCBpbml0KGludCBuKSB7CiAgICAgICAgY291bnQuYXNzaWduKG4sIDEpLCBwYXJlbnQuYXNzaWduKG4sIDApOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSBwYXJlbnRbaV0gPSBpOwogICAgfQoKICAgIGludCByb290KGludCB1KSB7CiAgICAgICAgd2hpbGUgKHUgIT0gcGFyZW50W3VdKQogICAgICAgICAgICB1ID0gcGFyZW50W3VdID0gcGFyZW50W3BhcmVudFt1XV07CiAgICAgICAgcmV0dXJuIHU7CiAgICB9CgogICAgdm9pZCBtZXJnZShpbnQgdSwgaW50IHYpIHsKICAgICAgICBpbnQgdXJvb3QgPSByb290KHUpLCB2cm9vdCA9IHJvb3Qodik7CiAgICAgICAgaWYgKHVyb290ID09IHZyb290KSByZXR1cm47CiAgICAgICAgaWYgKGNvdW50W3Vyb290XSA8IGNvdW50W3Zyb290XSkgc3dhcCh1cm9vdCwgdnJvb3QpOwogICAgICAgIGNvdW50W3Vyb290XSArPSBjb3VudFt2cm9vdF0sIHBhcmVudFt2cm9vdF0gPSB1cm9vdDsKICAgIH0KfTsKCnZvaWQgZ2V0U2hpdERvbmUoKSB7CiAgICBpbnQgbiwgbTsKICAgIGNpbiA+PiBuID4+IG07CgogICAgdmVjdG9yPCB2ZWN0b3I8IGFycmF5PGludCwgMj4gPiA+IGFkaihtKTsKICAgIGZvciAoaW50IGkgPSAwLCB1LCB2LCBjOyBpIDwgbTsgKytpKSB7CiAgICAgICAgY2luID4+IHUgPj4gdiA+PiBjOyAtLXUsIC0tdiwgLS1jOwogICAgICAgIGFkaltjXS5wdXNoX2JhY2soeyB1LCB2IH0pOwogICAgfQoKICAgIGludCBxOwogICAgY2luID4+IHE7CiAgICBpbnQgc3EgPSBzcXJ0KHEpICsgMTsKCiAgICB2ZWN0b3I8aW50PiBhbnMocSk7CiAgICB2ZWN0b3I8IHZlY3RvcjwgcGFpcjxpbnQsIGludD4gPiA+IHdpdGgobik7CiAgICBmb3IgKGludCBpID0gMCwgdSwgdjsgaSA8IHE7ICsraSkgewogICAgICAgIGNpbiA+PiB1ID4+IHY7IC0tdSwgLS12OwogICAgICAgIGlmICh1ID4gdikgc3dhcCh1LCB2KTsKICAgICAgICB3aXRoW3VdLnB1c2hfYmFjayh7IHYsIGkgfSk7CiAgICB9CgogICAgaW50IGNvdW50QmlnID0gMDsKICAgIHZlY3RvcjxpbnQ+IG1wKG4sIC0xKTsKICAgIHZlY3RvcjwgdmVjdG9yPCBwYWlyPGludCwgaW50PiA+ID4gYmlnOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoIHdpdGhbaV0uc2l6ZSgpID4gc3EgKSB7CiAgICAgICAgICAgIG1wW2ldID0gY291bnRCaWcrKywgYmlnLnB1c2hfYmFjayh7fSk7CiAgICAgICAgICAgIGZvciAoYXV0byBbdSwgaWRdIDogd2l0aFtpXSkgewogICAgICAgICAgICAgICAgaWYgKCB3aXRoW3VdLnNpemUoKSA+IHNxICkgewogICAgICAgICAgICAgICAgICAgIGJpZy5iYWNrKCkucHVzaF9iYWNrKHsgdSwgaWQgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHUgPiBpKSB7CiAgICAgICAgICAgICAgICAgICAgd2l0aFt1XS5wdXNoX2JhY2soeyBpLCBpZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB2ZWN0b3I8aW50PiB2aXMobik7CiAgICBEU1Ugc29sdmU7IHNvbHZlLmluaXQobik7CiAgICBmb3IgKGludCBpID0gMCwgdmlkID0gMTsgaSA8IG07ICsraSwgKyt2aWQpIHsKICAgICAgICBpZiAoIGFkaltpXS5lbXB0eSgpICkgY29udGludWU7CgogICAgICAgIHZlY3RvcjxpbnQ+IG5vZGVzOwogICAgICAgIGZvciAoYXV0byBbdSwgdl0gOiBhZGpbaV0pIHsKICAgICAgICAgICAgc29sdmUubWVyZ2UodSwgdik7CiAgICAgICAgICAgIGlmICh2aXNbdV0gIT0gdmlkKQogICAgICAgICAgICAgICAgdmlzW3VdID0gdmlkLCBub2Rlcy5wdXNoX2JhY2sodSk7CiAgICAgICAgICAgIGlmICh2aXNbdl0gIT0gdmlkKQogICAgICAgICAgICAgICAgdmlzW3ZdID0gdmlkLCBub2Rlcy5wdXNoX2JhY2sodik7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCB2IDogbm9kZXMpIHsKICAgICAgICAgICAgaWYgKCB3aXRoW3ZdLnNpemUoKSA8PSBzcSApIHsKICAgICAgICAgICAgICAgIGZvciAoYXV0byBbdSwgaWRdIDogd2l0aFt2XSkKICAgICAgICAgICAgICAgICAgICBpZiAoIHNvbHZlLnJvb3QodSkgPT0gc29sdmUucm9vdCh2KSApICsrYW5zW2lkXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAoYXV0byBbdSwgaWRdIDogYmlnWyBtcFt2XSBdKQogICAgICAgICAgICAgICAgICAgIGlmICggc29sdmUucm9vdCh1KSA9PSBzb2x2ZS5yb290KHYpICkgKythbnNbaWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCB2IDogbm9kZXMpCiAgICAgICAgICAgIHNvbHZlLnBhcmVudFt2XSA9IHYsIHNvbHZlLmNvdW50W3ZdID0gMTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7ICsraSkgY291dCA8PCBhbnNbaV0gPDwgJ1xuJzsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBfM2JrYXJtCgogICAgaW50IHRzID0gMTsKLy8gICAgY2luID4+IHRzOwogICAgd2hpbGUgKHRzLS0pIGdldFNoaXREb25lKCk7CgogICAgcmV0dXJuIDA7Cn0=