func_code_string: #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;   }   