func_code_string: #include <bits/stdc++.h>   using namespace std;   const int size = 100010;   const int bound = 100;   int n, m, qq;   int res[size], arr[size], father[size];   vector<pair<int, int> > edge[size];   pair<int, int> q[size];   map<int, int> ans[size];   int find(int x) { return father[x] == -1 ? x : father[x] = find(father[x]); }   void merge(int x, int y) {     int xx = find(x), yy = find(y);     if (xx != yy) {       father[xx] = yy;     }   }   void solve() {     for (int c = 1; c <= m; c++) {       for (auto i : edge[c]) {         merge(i.first, i.second);       }       if (edge[c].size() > bound) {         for (int j = 0; j < qq; j++) {           if (find(q[j].first) == find(q[j].second)) {             ++res[j];           }         }       } else {         int num = 0;         for (auto i : edge[c]) {           arr[num++] = i.first;           arr[num++] = i.second;         }         sort(arr, arr + num);         num = unique(arr, arr + num) - arr;         for (int u = 0; u < num; u++) {           for (int v = u + 1; v < num; v++) {             if (find(arr[u]) == find(arr[v])) {               ++ans[arr[u]][arr[v]];             }           }         }       }       for (auto i : edge[c]) {         father[i.first] = father[i.second] = -1;       }     }   }   int main() {     int a, b, c;     memset(father, -1, sizeof(father));     memset(res, 0, sizeof(res));     cin >> n >> m;     for (int i = 0; i < m; i++) {       cin >> a >> b >> c;       edge[c].push_back(make_pair(a, b));     }     cin >> qq;     for (int i = 0; i < qq; i++) {       cin >> q[i].first >> q[i].second;     }     solve();     for (int i = 0; i < qq; i++) {       cout << res[i] +                   max(ans[q[i].first][q[i].second], ans[q[i].second][q[i].first])            << endl;     }     return 0;   }   