#include <bits/stdc++.h>
long min[1001] = {0}, rec[1001] = {0}, ed[1001][2] = {0}, post[1001] = {0},
     f[1001] = {0}, stay[1001][1001] = {0}, ps[1001] = {0}, head[1001] = {0},
     e[2001] = {0}, next[2001] = {0}, v[2001] = {0};
char str[15] = {0}, th[1001][1001] = {0}, town[1001][1001] = {0},
     hash[1001][1001] = {0}, own[1001][1001] = {0}, name[1001][15] = {0};
long n, m, totm = 0, flag = 0;
void add(long a, long b, long c) {
  e[++totm] = b;
  next[totm] = head[a];
  head[a] = totm;
  v[totm] = c;
}
long getf(long now) {
  if (f[now] == now) return now;
  return f[now] = getf(f[now]);
}
void dfs(long now, long x) {
  long i, j, fa, tmp;
  hash[x][now] = 1;
  stay[now][++ps[now]] = x;
  tmp = ++flag;
  for (i = 1; i < ps[now]; i++)
    if (x != (fa = getf(stay[now][i]))) {
      f[fa] = x;
      for (j = 1; j <= m; j++)
        if (own[fa][j] && !own[x][j]) {
          own[x][j] = 1;
          rec[j] = flag;
        }
      for (j = 1; j <= n; j++) hash[x][j] |= hash[fa][j];
    }
  for (i = 1; i <= m; i++)
    if (rec[i] == tmp)
      if (hash[x][ed[i][0]] && !hash[x][ed[i][1]])
        dfs(ed[i][1], x);
      else if (hash[x][ed[i][1]] && !hash[x][ed[i][0]])
        dfs(ed[i][0], x);
  for (i = head[now]; i; i = next[i])
    if (!hash[x][e[i]] && own[x][v[i]]) dfs(e[i], x);
}
int main() {
  long i, j, k, a, b, pos, num, x, ans = 1;
  scanf("%ld%ld%ld", &n, &m, &k);
  for (i = 1; i <= m; i++) {
    scanf("%ld%ld", &a, &b);
    ed[i][0] = a;
    ed[i][1] = b;
    add(a, b, i);
    add(b, a, i);
  }
  for (i = 1; i <= k; i++) {
    f[i] = i;
    scanf("%s%ld%ld", name[i] + 1, &post[i], &num);
    stay[post[i]][++ps[post[i]]] = i;
    while (num--) {
      scanf("%ld", &x);
      own[i][x] = 1;
    }
  }
  for (i = 1; i <= k; i++)
    if (f[i] == i) dfs(post[i], i);
  for (i = 1; i <= k; i++)
    for (j = 1; j <= m; j++) town[i][j] = own[getf(i)][j];
  for (i = 1; i <= k; i++)
    for (j = 1; j <= n; j++) th[i][j] = hash[f[i]][j];
  memset(ps, 0, sizeof(ps));
  memset(own, 0, sizeof(own));
  memset(hash, 0, sizeof(hash));
  for (i = 1; i <= k; i++) {
    f[i] = i;
    scanf("%s%ld%ld", str + 1, &pos, &num);
    for (j = 1; strcmp(name[j] + 1, str + 1); j++)
      ;
    post[j] = pos;
    stay[post[j]][++ps[post[j]]] = j;
    while (num--) {
      scanf("%ld", &x);
      own[j][x] = 1;
    }
  }
  for (i = 1; i <= k; i++)
    if (f[i] == i) dfs(post[i], i);
  for (i = 1; i <= k; i++)
    for (j = 1; j <= m; j++)
      if (town[i][j] != own[getf(i)][j]) ans = 0;
  for (i = 1; i <= k; i++)
    for (j = 1; j <= n; j++)
      if (th[i][j] != hash[f[i]][j]) ans = 0;
  puts(ans ? "YES" : "NO");
  return 0;
}
