#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= f;
}
inline void judge() {
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
}
const int maxn = 500005;
int head[maxn], ne[maxn << 1], t[maxn << 1], dfn[maxn], low[maxn];
int num, clk, cnt = 0, n, m, q;
bool vis[maxn], flag[maxn];
int bl[maxn];
int faq[maxn], block;
inline void addedge(int x, int y) {
  ne[++num] = head[x];
  head[x] = num;
  t[num] = y;
  ne[++num] = head[y];
  head[y] = num;
  t[num] = x;
}
inline void dfs(int x, int y) {
  dfn[x] = low[x] = ++clk;
  vis[x] = 1;
  faq[x] = block;
  for (int i = head[x]; i != -1; i = ne[i])
    if (i != (y ^ 1)) {
      if (!vis[t[i]]) {
        dfs(t[i], i);
        low[x] = min(low[x], low[t[i]]);
      } else
        low[x] = min(low[x], dfn[t[i]]);
    }
  if (y != -1 && low[x] == dfn[x]) flag[y >> 1] = 1;
}
inline void calc(int x) {
  bl[x] = cnt;
  vis[x] = 1;
  for (int i = head[x]; i != -1; i = ne[i])
    if ((!vis[t[i]]) && (!flag[i >> 1])) calc(t[i]);
}
vector<int> son[maxn];
int fa[maxn][18], deep[maxn];
inline void dfs(int x) {
  for (int i = (1); i <= (17); i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (int v : son[x])
    if (v != fa[x][0]) {
      deep[v] = deep[x] + 1;
      fa[v][0] = x;
      dfs(v);
    }
}
inline int lca(int x, int y) {
  if (deep[x] < deep[y]) swap(x, y);
  int dep = deep[x] - deep[y];
  for (int i = (0); i <= (17); i++)
    if ((1 << i) & dep) x = fa[x][i];
  if (x == y) return x;
  for (int i = (17); i >= (0); i--)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
inline void Fail() {
  puts("No");
  exit(0);
}
namespace ltree {
pair<int, int> v[maxn];
int l[maxn], r[maxn], d[maxn];
inline int merge(int x, int y) {
  if (!x || !y) return x + y;
  if (deep[v[x].first] < deep[v[y].first]) swap(x, y);
  r[x] = merge(r[x], y);
  if (d[l[x]] < d[r[x]]) swap(l[x], r[x]);
  d[x] = d[r[x]] + 1;
  return x;
}
inline int pop(int x) { return merge(l[x], r[x]); }
};  // namespace ltree
int tot = 0;
vector<int> a[maxn];
int root[maxn];
inline void Getans(int x) {
  vis[x] = 1;
  for (int v : son[x])
    if (v != fa[x][0]) {
      Getans(v);
      while (root[v] && ltree::v[root[v]].first == x)
        root[v] = ltree::pop(root[v]);
      if (root[x] && root[v]) {
        if (ltree::v[root[x]].second != ltree::v[root[v]].second) Fail();
      }
      root[x] = ltree::merge(root[x], root[v]);
    }
  while (root[x] && ltree::v[root[x]].first == x) root[x] = ltree::pop(root[x]);
  for (int w : a[x]) {
    if (root[x] && ltree::v[root[x]].second != ltree::v[w].second) Fail();
    root[x] = ltree::merge(root[x], w);
  }
  while (root[x] && ltree::v[root[x]].first == x) root[x] = ltree::pop(root[x]);
}
int main() {
  read(n);
  read(m);
  read(q);
  for (int i = (1); i <= (n); i++) head[i] = -1;
  num = 1;
  for (int i = (1); i <= (m); i++) {
    int x, y;
    read(x);
    read(y);
    assert(x != y);
    addedge(x, y);
  }
  for (int i = (1); i <= (n); i++) {
    if (!vis[i]) block++, dfs(i, -1);
  }
  for (int i = (1); i <= (n); i++) assert(vis[i]);
  memset(vis, 0, sizeof(vis));
  for (int i = (1); i <= (n); i++)
    if (!vis[i]) {
      cnt++;
      calc(i);
    }
  for (int i = (1); i <= (m); i++)
    if (flag[i]) {
      if (bl[t[i << 1]] == bl[t[(i << 1) | 1]]) continue;
      son[bl[t[i << 1]]].push_back(bl[t[(i << 1) | 1]]);
      son[bl[t[(i << 1) | 1]]].push_back(bl[t[i << 1]]);
    }
  for (int i = (1); i <= (n); i++)
    if (!fa[i][0]) dfs(i);
  for (int i = (1); i <= (q); i++) {
    int x, y;
    read(x);
    read(y);
    if (faq[x] != faq[y]) Fail();
    int u = lca(bl[x], bl[y]);
    if (bl[x] == bl[y]) continue;
    if (u != bl[x]) ltree::v[++tot] = make_pair(u, 0), a[bl[x]].push_back(tot);
    if (u != bl[y]) ltree::v[++tot] = make_pair(u, 1), a[bl[y]].push_back(tot);
  }
  memset(vis, 0, sizeof(vis));
  for (int i = (1); i <= (n); i++)
    if (!vis[i]) Getans(i);
  printf("Yes\n");
  return 0;
}
