#include <bits/stdc++.h>
using namespace std;
const long long MAX_N = 100 * 1000 + 24, INF = (1 << 30);
int n, m, q, a, b, c, ans, h;
map<int, vector<int>> G[MAX_N];
map<int, int> mm[MAX_N];
map<pair<int, int>, int> out;
bool mark[MAX_N];
set<int> cl[MAX_N], cs;
void dfs(int v, int k, int c) {
  mark[v] = true;
  mm[v][c] = k;
  if (G[v].count(c) > 0) {
    for (int u : G[v][c]) {
      if (mark[u] == false) {
        dfs(u, k, c);
      }
    }
  }
}
int main() {
  cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
  scanf("%d %d", &n, &m);
  while (m--) {
    scanf("%d %d %d", &a, &b, &c);
    G[a][c].push_back(b);
    G[b][c].push_back(a);
    cl[c].insert(a);
    cs.insert(c);
  }
  for (set<int>::iterator i = cs.begin(); i != cs.end(); i++) {
    memset(mark, 0, sizeof mark);
    for (set<int>::iterator j = cl[*i].begin(); j != cl[*i].end(); j++) {
      if (mark[*j] == false) {
        dfs(*j, *j, *i);
      }
    }
  }
  scanf("%d", &q);
  while (q--) {
    ans = 0;
    scanf("%d %d", &a, &b);
    if (mm[a].size() > mm[b].size()) swap(a, b);
    if (out.count(make_pair(a, b)) == 0) {
      for (pair<int, int> u : mm[a]) {
        if (mm[b].count(u.first) > 0 and u.second == mm[b][u.first]) ans++;
      }
      out[make_pair(a, b)] = ans;
      printf("%d\n", ans);
    } else
      printf("%d\n", out[make_pair(a, b)]);
  }
}
