#include <bits/stdc++.h>
using namespace std;
unordered_map<int, int> parent[100005];
unordered_map<int, int> depth[100005];
unordered_map<int, int> memo[100005];
int Find(int node, int color) {
  if (parent[node][color] == node) return node;
  parent[node][color] = Find(parent[node][color], color);
  return parent[node][color];
}
void Union(int a, int b, int color) {
  if (!parent[a].count(color)) {
    parent[a][color] = a;
  }
  if (!parent[b].count(color)) {
    parent[b][color] = b;
  }
  int roota(Find(a, color));
  int rootb(Find(b, color));
  if (depth[roota][color] < depth[rootb][color]) swap(roota, rootb);
  if (depth[roota][color] == depth[rootb][color]) depth[roota][color]++;
  parent[rootb][color] = roota;
}
int solve(int a, int b) {
  if (memo[a].count(b)) return memo[a][b];
  int res(0);
  if (parent[a].size() > parent[b].size()) swap(a, b);
  unordered_map<int, int>::iterator it;
  for (it = parent[a].begin(); it != parent[a].end(); it++) {
    int color(it->first);
    if (!parent[b].count(color)) continue;
    if (Find(a, color) == Find(b, color)) res++;
  }
  memo[a][b] = memo[b][a] = res;
  return res;
}
int main() {
  int n, m, q;
  cin >> n >> m;
  for (int a, b, c, i = 0; i < m; i++) {
    scanf("%d%d%d", &a, &b, &c);
    a--;
    b--;
    Union(a, b, c);
  }
  cin >> q;
  for (int a, b, i = 0; i < q; i++) {
    scanf("%d%d", &a, &b);
    a--;
    b--;
    printf("%d\n", solve(a, b));
  }
  return 0;
}
