func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m, k;   vector<pair<int, int> > g[1001];   int obtenpadre(int u, int padre[1001]) {     if (padre[u] == 0) return u;     padre[u] = obtenpadre(padre[u], padre);     return padre[u];   }   void unir(int u, int v, int padre[1001], int llaves[1001][1001]) {     padre[v] = u;     for (int i = 1; i <= m; i++)       if (llaves[v][i]) llaves[u][i] = 1;   }   void ejecuta(int padre[1001], int llaves[1001][1001]) {     bool cambios = true;     while (cambios) {       cambios = false;       for (int u = 1; u <= n; u++) {         vector<pair<int, int> > &ar = g[u];         for (int i = 0; i < int(ar.size()); i++) {           int v = ar[i].first;           int l = ar[i].second;           int pu = obtenpadre(u, padre);           int pv = obtenpadre(v, padre);           if (pu != pv and (llaves[pu][l] or llaves[pv][l])) {             unir(pu, pv, padre, llaves);             cambios = true;           }         }       }     }   }   map<string, int> posini[2];   int padre[2][1001];   int llaves[2][1001][1001];   int visto[2][1001];   int main() {     cin >> n >> m >> k;     for (int i = 1; i <= m; i++) {       int u, v;       cin >> u >> v;       g[u].push_back(pair<int, int>(v, i));       g[v].push_back(pair<int, int>(u, i));     }     for (int p = 0; p < 2; p++) {       for (int i = 1; i <= k; i++) {         string s;         int h, amount;         cin >> s >> h >> amount;         posini[p][s] = h;         for (int j = 0; j < amount; j++) {           int x;           cin >> x;           llaves[p][h][x] = 1;         }       }       ejecuta(padre[p], llaves[p]);     }     for (map<string, int>::iterator it = posini[0].begin(); it != posini[0].end();          it++) {       string s = it->first;       int h0 = it->second;       int h1 = posini[1][s];       if (obtenpadre(h0, padre[0]) != obtenpadre(h1, padre[0])) {         cout <<  NO  << endl;         exit(0);       }     }     for (int u = 1; u <= n; u++) {       int h0 = obtenpadre(u, padre[0]);       int h1 = obtenpadre(u, padre[1]);       if (visto[0][h0] != visto[1][h1]) {         cout <<  NO  << endl;         exit(0);       }       if (visto[0][h0] == 0) {         visto[0][h0] = visto[1][h1] = 1;         for (int j = 1; j <= m; j++) {           if (llaves[0][h0][j] != llaves[1][h1][j]) {             cout <<  NO  << endl;             exit(0);           }         }       }     }     cout <<  YES  << endl;   }   