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