#include <bits/stdc++.h>
using namespace std;
map<string, int> who;
map<int, string> tag;
class Resident {
 public:
  int name, room;
  vector<int> keys;
  void get() {
    int cnt, idx;
    char s[100];
    scanf("%s%d%d", s, &room, &cnt);
    auto t = who.find(s);
    if (t == who.end()) {
      name = who.size();
      who[tag[name] = s] = name;
    } else {
      name = t->second;
    }
    for (keys = {}; cnt--; keys.push_back(idx)) scanf("%d", &idx);
    sort(keys.begin(), keys.end());
  }
};
int x[1005], y[1005], n, m, k;
vector<int> e[1005];
vector<tuple<vector<int>, vector<int>, vector<int>>> gao(Resident a[]) {
  queue<pair<int, int>> ck;
  int idx[1005];
  vector<int> g[1005], u[1005];
  for (int i = 1; i <= n; i++) g[idx[i] = i] = {i};
  for (int i = 1; i <= k; i++) {
    u[a[i].room].push_back(i);
    ck.push({a[i].room, i});
  }
  while (ck.size()) {
    int room = ck.front().first;
    int whom = ck.front().second;
    vector<int>& keys = a[whom].keys;
    ck.pop();
    for (auto w : e[room]) {
      auto t = lower_bound(keys.begin(), keys.end(), w);
      if (t == keys.end() || *t != w) continue;
      int i = idx[room], j = idx[x[w] != room ? x[w] : y[w]];
      if (i == j) continue;
      if (g[i].size() * 3 + u[i].size() * 2 < g[j].size() * 3 + u[j].size() * 2)
        swap(i, j);
      for (auto ii : g[i])
        for (auto jj : u[j]) ck.push({ii, jj});
      for (auto ii : g[j])
        for (auto jj : u[i]) ck.push({ii, jj});
      for (auto ii : g[j]) idx[ii] = i;
      g[i].insert(g[i].end(), g[j].begin(), g[j].end());
      u[i].insert(u[i].end(), u[j].begin(), u[j].end());
      g[j].clear(), u[j].clear();
    }
  }
  vector<tuple<vector<int>, vector<int>, vector<int>>> ret;
  for (int i = 1; i <= n; i++) {
    if (!g[i].size() && !u[i].size()) continue;
    tuple<vector<int>, vector<int>, vector<int>> tmp;
    vector<int> keys;
    for (auto& x : u[i]) {
      keys.insert(keys.end(), a[x].keys.begin(), a[x].keys.end());
      x = a[x].name;
    }
    sort(g[i].begin(), g[i].end());
    sort(u[i].begin(), u[i].end());
    sort(keys.begin(), keys.end());
    ret.emplace_back(make_tuple(g[i], u[i], keys));
  }
  sort(ret.begin(), ret.end());
  return ret;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", x + i, y + i);
    e[x[i]].push_back(i);
    e[y[i]].push_back(i);
  }
  Resident a[1005], b[1005];
  for (int i = 1; i <= k; i++) a[i].get();
  for (int i = 1; i <= k; i++) b[i].get();
  puts(gao(a) == gao(b) ? "YES" : "NO");
}
