#include <bits/stdc++.h>
using namespace std;
bool flag;
int N, M, K, x, y, i, j, k, ff, tot, x1, x2, ll, len, pp, l1, l2, lee;
int vis[10010], vis2[10010], room[10010], key[10010];
int w[10010], ww[10010], num[10010], numm[10010], mark[10010];
int st[10010], ne[10010], go[10010], pt;
int stk[10010], nek[10010], gok[10010], ptk;
int stm[10010], nem[10010], gom[10010], ptm;
char s[10010][51], ss[10010][51], str[51];
bool same(int x, int y) {
  l1 = strlen(s[x]);
  l2 = strlen(ss[y]);
  if (l1 != l2) return false;
  for (k = 0; k < l1; k++)
    if (s[x][k] != ss[y][k]) return false;
  return true;
}
void make(int x, int y) {
  if (vis[x] != tot && vis[y] == tot) {
    x1 = vis[x];
    x2 = vis[y];
    flag = true;
    if (vis[x]) {
      for (k = stm[x1]; k; k = nem[k]) {
        vis[gom[k]] = tot;
        room[++ll] = gom[k];
        ff = k;
      }
      nem[ff] = stm[x2];
      stm[x2] = stm[x1];
      stm[x1] = 0;
    } else {
      room[++ll] = x;
      vis[x] = tot;
      nem[++ptm] = stm[x2];
      stm[x2] = ptm;
      gom[ptm] = x;
    }
  }
}
void work() {
  for (i = 1; i <= N; i++)
    if (!vis[i]) {
      vis[i] = ++tot;
      nem[++ptm] = stm[tot];
      stm[tot] = ptm;
      gom[ptm] = i;
      len = 0;
      for (j = stk[i]; j; j = nek[j]) key[++len] = gok[j];
      if (len) flag = true;
      for (; flag;) {
        flag = false;
        ll = 0;
        lee = 0;
        for (j = 1; j <= len; j++) {
          x = go[2 * key[j] - 1];
          y = go[2 * key[j]];
          make(x, y);
          make(y, x);
          if (vis[x] != tot && vis[y] != tot) {
            key[++lee] = key[j];
          }
        }
        len = lee;
        for (k = 1; k <= ll; k++) {
          x = room[k];
          for (j = stk[x]; j; j = nek[j]) key[++len] = gok[j];
        }
      }
    }
  for (i = 1; i <= tot; i++)
    for (j = stm[i]; j; j = nem[j]) vis[gom[j]] = i;
}
int main() {
  scanf("%d%d%d", &N, &M, &K);
  for (i = 1; i <= M; i++) {
    scanf("%d%d", &x, &y);
    ne[++pt] = st[y];
    st[y] = pt;
    go[pt] = x;
    ne[++pt] = st[x];
    st[y] = pt;
    go[pt] = y;
  }
  scanf("\n");
  for (i = 1; i <= K; i++) {
    scanf("%s%d%d", s[i], &w[i], &pp);
    y = w[i];
    for (j = 1; j <= pp; j++) {
      scanf("%d", &x);
      nek[++ptk] = stk[y];
      stk[y] = ptk;
      gok[ptk] = x;
      num[x] = y;
    }
    gets(str);
  }
  work();
  memcpy(vis2, vis, sizeof(vis2));
  tot = 0;
  memcpy(ww, w, sizeof(ww));
  memset(stk, 0, sizeof(stk));
  ptk = 0;
  memset(stm, 0, sizeof(stm));
  ptm = 0;
  memset(vis, 0, sizeof(vis));
  for (i = 1; i <= K; i++) {
    scanf("%s%d%d", ss[i], &w[i], &pp);
    y = w[i];
    for (j = 1; j <= pp; j++) {
      scanf("%d", &x);
      nek[++ptk] = stk[y];
      stk[y] = ptk;
      gok[ptk] = x;
      numm[x] = y;
    }
    gets(str);
  }
  work();
  memset(mark, 0, sizeof(mark));
  tot = 0;
  for (i = 1; i <= N; i++) {
    if (!mark[vis[i]]) mark[vis[i]] = ++tot;
    vis[i] = mark[vis[i]];
  }
  memset(mark, 0, sizeof(mark));
  tot = 0;
  for (i = 1; i <= N; i++) {
    if (!mark[vis2[i]]) mark[vis2[i]] = ++tot;
    vis2[i] = mark[vis2[i]];
  }
  flag = true;
  for (i = 1; i <= N; i++)
    if (vis[i] != vis2[i]) {
      flag = false;
      break;
    }
  if (flag) {
    for (i = 1; i <= N; i++) {
      for (j = 1; j <= N; j++)
        if (same(i, j)) {
          k = j;
          break;
        }
      if (vis[ww[i]] != vis[w[j]]) {
        flag = false;
        break;
      }
    }
    for (i = 1; i <= M; i++)
      if (vis[num[i]] != vis[numm[i]]) {
        flag = false;
        break;
      }
  }
  if (flag)
    printf("YES");
  else
    printf("NO");
}
