#include <bits/stdc++.h>
using namespace std;
struct fastIO {
  inline fastIO operator>>(int& num) {
    num = 0;
    char c = getchar();
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    bool foo = 0;
    if (c == '-') {
      foo = 1;
      c = getchar();
    }
    while (c >= '0' && c <= '9') {
      num = (num << 3) + (num << 1) + c - '0';
      c = getchar();
    }
    if (foo) num = -num;
    return *this;
  }
  inline fastIO operator>>(long long& num) {
    num = 0;
    char c = getchar();
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    bool foo = 0;
    if (c == '-') {
      foo = 1;
      c = getchar();
    }
    while (c >= '0' && c <= '9') {
      num = (num << 3) + (num << 1) + c - '0';
      c = getchar();
    }
    if (foo) num = -num;
    return *this;
  }
  inline fastIO operator>>(float& num) {
    scanf("%f", &num);
    return *this;
  }
  inline fastIO operator>>(double& num) {
    scanf("%lf", &num);
    return *this;
  }
  inline fastIO operator>>(long double& num) {
    scanf("%Lf", &num);
    return *this;
  }
  inline fastIO operator>>(char& num) {
    num = getchar();
    while (num == ' ' || num == '\n') num = getchar();
    return *this;
  }
  inline fastIO operator>>(char* num) {
    int cnt = 0;
    char c = getchar();
    while (c == ' ' || c == '\n') c = getchar();
    while (c != ' ' && c != '\n') {
      num[cnt++] = c;
      c = getchar();
    }
    num[cnt] = 0;
    return *this;
  }
  inline fastIO operator>>(string& num) {
    cin >> num;
    return *this;
  }
  inline void printInt(const int& num) {
    if (num < 10) {
      putchar(num + '0');
      return;
    }
    printInt(num / 10);
    putchar((num % 10) + '0');
  }
  inline void printINT(const long long& num) {
    if (num < 10) {
      putchar(num + '0');
      return;
    }
    printINT(num / 10);
    putchar((num % 10) + '0');
  }
  inline fastIO operator<<(const int& num) {
    if (num < 0)
      putchar('-'), printInt(-num);
    else
      printInt(num);
    return *this;
  }
  inline fastIO operator<<(const long long& num) {
    if (num < 0)
      putchar('-'), printINT(-num);
    else
      printINT(num);
    return *this;
  }
  inline fastIO operator<<(const float& num) {
    printf("%.10f", num);
    return *this;
  }
  inline fastIO operator<<(const double& num) {
    printf("%.16lf", num);
    return *this;
  }
  inline fastIO operator<<(const long double& num) {
    printf("%.20Lf", num);
    return *this;
  }
  inline fastIO operator<<(const char& num) {
    putchar(num);
    return *this;
  }
  inline fastIO operator<<(const char* num) {
    for (int i = 0; num[i]; i++) putchar(num[i]);
    return *this;
  }
  inline fastIO operator<<(const string& num) {
    cout << num;
    return *this;
  }
} fio;
int key[2][1005];
int n, m, k;
bool lgl[1005];
int X[1005], Y[1005];
struct DSU {
  int fa[1005];
  void init() {
    for (int i = 0; i < 1005; i++) {
      fa[i] = i;
    }
  }
  int root(int x) { return fa[x] == x ? x : (fa[x] = root(fa[x])); }
  void conn(int x, int y) {
    x = root(x);
    y = root(y);
    fa[x] = y;
  }
} dsu1, dsu2;
map<int, int> ks;
vector<int> keys[2][1005];
int main() {
  fio >> n >> m >> k;
  map<string, vector<int> > nms;
  map<int, vector<int> > kys;
  for (int i = 1; i <= m; i++) {
    fio >> X[i] >> Y[i];
  }
  for (int Itfff = 0; Itfff < 2; Itfff++) {
    for (int i = 1; i <= k; i++) {
      string s;
      fio >> s;
      int rm;
      fio >> rm;
      nms[s].push_back(rm);
      int kss;
      fio >> kss;
      for (int j = 0; j < kss; j++) {
        int FF;
        fio >> FF;
        keys[Itfff][rm].push_back(FF);
        kys[FF].push_back(rm);
      }
    }
  }
  bool can = 1;
  for (int Itfff = 0; Itfff < 2; Itfff++) {
    dsu1.init();
    dsu2.init();
    ks.clear();
    for (int i = 1; i <= n; i++) {
      int idx = -1;
      for (int j = 0; j < ((int)(keys[Itfff][i]).size()); j++) {
        if (idx != -1) {
          dsu2.conn(idx, keys[Itfff][i][j]);
        }
        idx = dsu2.root(keys[Itfff][i][j]);
      }
      ks[dsu1.root(i)] = idx;
    }
    memset((void*)lgl, 0, sizeof(lgl));
    while (1) {
      bool cgd = 0;
      for (int i = 1; i <= m; i++) {
        if (lgl[i]) {
          continue;
        }
        if (dsu1.root(X[i]) == dsu1.root(Y[i])) {
          continue;
        }
        int s1 = ks[dsu1.root(X[i])], s2 = ks[dsu1.root(Y[i])];
        if (dsu2.root(i) == s1 || dsu2.root(i) == s2) {
          cgd = 1;
          lgl[i] = 1;
          dsu1.conn(X[i], Y[i]);
          int rt = dsu1.root(X[i]);
          int rrr;
          if (s1 == -1) {
            rrr = s2;
          } else if (s2 == -1) {
            rrr = s1;
          } else {
            dsu2.conn(s1, s2);
            rrr = dsu2.root(s1);
          }
          ks[rt] = rrr;
        }
      }
      if (!cgd) {
        break;
      }
    }
    for (int i = 1; i <= m; i++) {
      if (dsu1.root(kys[i][0]) != dsu1.root(kys[i][1])) {
        can = 0;
        break;
      }
    }
    for (__typeof(nms.begin()) it = nms.begin(); it != nms.end(); it++) {
      if (dsu1.root(it->second[0]) != dsu1.root(it->second[1])) {
        can = 0;
        break;
      }
    }
  }
  if (can) {
    fio << "YES\n";
  } else {
    fio << "NO\n";
  }
  return 0;
}
