#include <bits/stdc++.h>
using namespace std;
template<class A, class B> bool maximize(A& x, B y) {if (x < y) return x = y, true; else return false;}
template<class A, class B> bool minimize(A& x, B y) {if (x >= y) return x = y, true; else return false;}
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
typedef pair<db, db> pdb;
typedef pair<ld, ld> pld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> plli;
typedef pair<int, ll> pill;
#define all(a) a.begin(), a.end()
#define pb(a) push_back(a)
#define pf(a) push_front(a)
#define fi first
#define se second
// #define int long long
const int MAX_N = 1e5 + 5;
int n, m, numQ;
int root[MAX_N];
vector<pii> edgeColor[MAX_N];
vector<int> adj[MAX_N];
int ans[MAX_N];
vector<pii> q[MAX_N];
vector<int> colorList[MAX_N];
map<pii, int> id;
int qId[MAX_N];
int findRoot(int u) {
return root[u] = (root[u] == u ? u : findRoot(root[u]));
}
void unionSet(int u, int v) {
int rootU = findRoot(u);
int rootV = findRoot(v);
if (rootU != rootV) {
root[rootU] = rootV;
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
root[i] = i;
}
for (int i = 1; i <= m; i++) {
int u, v, c;
cin >> u >> v >> c;
edgeColor[c].pb(make_pair(u, v));
colorList[c].pb(u);
colorList[c].pb(v);
adj[u].pb(v);
adj[v].pb(u);
}
for (int i = 1; i <= n; i++) {
sort(all(adj[i]));
adj[i].erase(unique(all(adj[i])), adj[i].end());
}
for (int i = 1; i <= m; i++) {
sort(all(colorList[i]));
colorList[i].erase(unique(all(colorList[i])), colorList[i].end());
}
cin >> numQ;
for (int i = 1; i <= numQ; i++) {
int u, v;
cin >> u >> v;
if (adj[u].size() > adj[v].size()) swap(u, v);
auto InsId = id.insert({{u, v}, 0});
if (InsId.se) {
InsId.fi->se = i;
q[u].pb(make_pair(v, i));
}
qId[i] = InsId.fi->se;
}
for (int c = 1; c <= m; c++) {
for (auto it : edgeColor[c]) {
unionSet(it.fi, it.se);
}
for (auto u : colorList[c]) {
for (auto it : q[u]) {
ans[it.se] += (findRoot(u) == findRoot(it.fi));
}
}
for (auto u : colorList[c]) {
root[u] = u;
}
}
for (int i = 1; i <= numQ; i++) {
cout << ans[qId[i]] << '\n';
}
return 0;
}
/*
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIEEsIGNsYXNzIEI+IGJvb2wgbWF4aW1pemUoQSYgeCwgQiB5KSB7aWYgKHggPCB5KSByZXR1cm4geCA9IHksIHRydWU7IGVsc2UgcmV0dXJuIGZhbHNlO30KdGVtcGxhdGU8Y2xhc3MgQSwgY2xhc3MgQj4gYm9vbCBtaW5pbWl6ZShBJiB4LCBCIHkpIHtpZiAoeCA+PSB5KSByZXR1cm4geCA9IHksIHRydWU7IGVsc2UgcmV0dXJuIGZhbHNlO30KCnR5cGVkZWYgICAgIGxvbmcgbG9uZyAgICAgICAgICAgICBsbDsKdHlwZWRlZiAgICAgdW5zaWduZWQgbG9uZyBsb25nICAgIHVsbDsKdHlwZWRlZiAgICAgZG91YmxlICAgICAgICAgICAgICAgIGRiOwp0eXBlZGVmICAgICBsb25nIGRvdWJsZSAgICAgICAgICAgbGQ7CnR5cGVkZWYgICAgIHBhaXI8ZGIsIGRiPiAgICAgICAgICBwZGI7CnR5cGVkZWYgICAgIHBhaXI8bGQsIGxkPiAgICAgICAgICBwbGQ7CnR5cGVkZWYgICAgIHBhaXI8aW50LCBpbnQ+ICAgICAgICBwaWk7CnR5cGVkZWYgICAgIHBhaXI8bGwsIGxsPiAgICAgICAgICBwbGw7CnR5cGVkZWYgICAgIHBhaXI8bGwsIGludD4gICAgICAgICBwbGxpOwp0eXBlZGVmICAgICBwYWlyPGludCwgbGw+ICAgICAgICAgcGlsbDsKCiNkZWZpbmUgICAgIGFsbChhKSAgICAgICAgICAgICAgICBhLmJlZ2luKCksIGEuZW5kKCkKI2RlZmluZSAgICAgcGIoYSkgICAgICAgICAgICAgICAgIHB1c2hfYmFjayhhKQojZGVmaW5lICAgICBwZihhKSAgICAgICAgICAgICAgICAgcHVzaF9mcm9udChhKQojZGVmaW5lICAgICBmaSAgICAgICAgICAgICAgICAgICAgZmlyc3QKI2RlZmluZSAgICAgc2UgICAgICAgICAgICAgICAgICAgIHNlY29uZAovLyAjZGVmaW5lICAgICBpbnQgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nCgpjb25zdCBpbnQgTUFYX04gPSAxZTUgKyA1OwoKaW50IG4sIG0sIG51bVE7CmludCByb290W01BWF9OXTsKdmVjdG9yPHBpaT4gZWRnZUNvbG9yW01BWF9OXTsKdmVjdG9yPGludD4gYWRqW01BWF9OXTsKaW50IGFuc1tNQVhfTl07CnZlY3RvcjxwaWk+IHFbTUFYX05dOwp2ZWN0b3I8aW50PiBjb2xvckxpc3RbTUFYX05dOwptYXA8cGlpLCBpbnQ+IGlkOwppbnQgcUlkW01BWF9OXTsKCmludCBmaW5kUm9vdChpbnQgdSkgewoJcmV0dXJuIHJvb3RbdV0gPSAocm9vdFt1XSA9PSB1ID8gdSA6IGZpbmRSb290KHJvb3RbdV0pKTsKfQoKdm9pZCB1bmlvblNldChpbnQgdSwgaW50IHYpIHsKCWludCByb290VSA9IGZpbmRSb290KHUpOwoJaW50IHJvb3RWID0gZmluZFJvb3Qodik7CglpZiAocm9vdFUgIT0gcm9vdFYpIHsKCQlyb290W3Jvb3RVXSA9IHJvb3RWOwoJfQp9CgpzaWduZWQgbWFpbigpIHsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luLnRpZShudWxscHRyKTsKCgljaW4gPj4gbiA+PiBtOwoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJcm9vdFtpXSA9IGk7Cgl9Cglmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspIHsKCQlpbnQgdSwgdiwgYzsKCQljaW4gPj4gdSA+PiB2ID4+IGM7CgkJZWRnZUNvbG9yW2NdLnBiKG1ha2VfcGFpcih1LCB2KSk7CgkJY29sb3JMaXN0W2NdLnBiKHUpOwoJCWNvbG9yTGlzdFtjXS5wYih2KTsKCQlhZGpbdV0ucGIodik7CgkJYWRqW3ZdLnBiKHUpOwoJfQoKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCXNvcnQoYWxsKGFkaltpXSkpOwoJCWFkaltpXS5lcmFzZSh1bmlxdWUoYWxsKGFkaltpXSkpLCBhZGpbaV0uZW5kKCkpOwoJfQoKCWZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykgewoJCXNvcnQoYWxsKGNvbG9yTGlzdFtpXSkpOwoJCWNvbG9yTGlzdFtpXS5lcmFzZSh1bmlxdWUoYWxsKGNvbG9yTGlzdFtpXSkpLCBjb2xvckxpc3RbaV0uZW5kKCkpOwoJfQoKCWNpbiA+PiBudW1ROwoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtUTsgaSsrKSB7CgkJaW50IHUsIHY7CgkJY2luID4+IHUgPj4gdjsKCQlpZiAoYWRqW3VdLnNpemUoKSA+IGFkalt2XS5zaXplKCkpIHN3YXAodSwgdik7CgkJYXV0byBJbnNJZCA9IGlkLmluc2VydCh7e3UsIHZ9LCAwfSk7CgkJaWYgKEluc0lkLnNlKSB7CgkJCUluc0lkLmZpLT5zZSA9IGk7CgkJCXFbdV0ucGIobWFrZV9wYWlyKHYsIGkpKTsKCQl9CgkJcUlkW2ldID0gSW5zSWQuZmktPnNlOwoJfQoKCWZvciAoaW50IGMgPSAxOyBjIDw9IG07IGMrKykgewoJCWZvciAoYXV0byBpdCA6IGVkZ2VDb2xvcltjXSkgewoJCQl1bmlvblNldChpdC5maSwgaXQuc2UpOwoJCX0KCQlmb3IgKGF1dG8gdSA6IGNvbG9yTGlzdFtjXSkgewoJCQlmb3IgKGF1dG8gaXQgOiBxW3VdKSB7CgkJCQlhbnNbaXQuc2VdICs9IChmaW5kUm9vdCh1KSA9PSBmaW5kUm9vdChpdC5maSkpOwoJCQl9CgkJfQoJCWZvciAoYXV0byB1IDogY29sb3JMaXN0W2NdKSB7CgkJCXJvb3RbdV0gPSB1OwoJCX0KCX0KCglmb3IgKGludCBpID0gMTsgaSA8PSBudW1ROyBpKyspIHsKCQljb3V0IDw8IGFuc1txSWRbaV1dIDw8ICdcbic7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qCgoKKi8=