#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5;
int n, m, q, len = 1, lin[maxn + 5], dfn[maxn + 5], low[maxn + 5], cnt = 0,
             color[maxn + 5], tot = 0, graph[maxn + 5], pnt = 0;
bool bridge[maxn + 5], ans = 1, vis[maxn + 5];
vector<int> E[maxn + 5];
vector<bool> flag[maxn + 5];
int dep[maxn + 5], up[maxn + 5], down[maxn + 5], RMQ[(maxn << 1) + 5],
    tmp = 0, Dfn[maxn + 5], f[32][(maxn << 1) + 5];
struct edge {
  int y, next;
} e[(maxn << 1) + 5];
inline void insert(int x, int y) {
  e[++len] = (edge){y, lin[x]};
  lin[x] = len;
}
inline int dread() {
  int x = 0;
  bool f = 0;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar()) f ^= (ch == '-');
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    x = (x << 1) + (x << 3) + (ch ^ 48);
  return f ? -x : x;
}
void tarjan(int x, int in_edge) {
  dfn[x] = low[x] = ++cnt, graph[x] = pnt;
  for (int i = lin[x]; i; i = e[i].next) {
    int y = e[i].y;
    if (!dfn[y]) {
      tarjan(y, i >> 1);
      low[x] = min(low[x], low[y]);
      if (low[y] > dfn[x]) bridge[i >> 1] = 1;
    } else if ((i >> 1) != in_edge)
      low[x] = min(low[x], dfn[y]);
  }
}
void paint_it(int x) {
  if (color[x])
    return;
  else
    color[x] = tot;
  for (int i = lin[x]; i; i = e[i].next) {
    if (bridge[i >> 1]) continue;
    paint_it(e[i].y);
  }
}
void pre(int x, int fa) {
  dep[x] = dep[fa] + 1, Dfn[RMQ[++tmp] = x] = tmp, vis[x] = 1;
  for (int i = 0, lim = E[x].size(); i < lim; ++i) {
    int y = E[x][i];
    if (y == fa) continue;
    pre(y, x), RMQ[++tmp] = x;
  }
}
pair<int, int> dfs(int x, int fa) {
  int res1 = up[x], res2 = down[x];
  vis[x] = 1;
  for (int i = 0, lim = E[x].size(); i < lim; ++i) {
    int y = E[x][i];
    pair<int, int> temp;
    bool flag1, flag2;
    if (y == fa) continue;
    temp = dfs(y, x);
    flag1 = temp.first, flag2 = temp.second;
    if (flag1 && flag2) ans = 0;
    res1 += temp.first, res2 += temp.second;
  }
  return make_pair(res1, res2);
}
inline int _min(int x, int y) { return dep[x] > dep[y] ? y : x; }
inline int LCA(int x, int y) {
  if (Dfn[x] > Dfn[y]) swap(x, y);
  int L = Dfn[x], R = Dfn[y], g = log2(R - L + 1);
  return _min(f[g][L], f[g][R - (1 << g) + 1]);
}
inline void Kaslana() {
  n = dread(), m = dread(), q = dread();
  for (int i = 1; i <= m; ++i) {
    int u = dread(), v = dread();
    insert(u, v), insert(v, u);
  }
}
inline void Raiden() {
  for (int i = 1; i <= n; ++i)
    if (!dfn[i]) ++pnt, tarjan(i, 0);
  for (int i = 1; i <= n; ++i)
    if (!color[i]) ++tot, paint_it(i);
  for (int x = 1; x <= n; ++x)
    for (int i = lin[x]; i; i = e[i].next) {
      if (!bridge[i >> 1]) continue;
      E[color[x]].push_back(color[e[i].y]);
    }
  for (int i = 1; i <= tot; ++i)
    if (!vis[i]) pre(i, 0);
  for (int i = 1; i <= tmp; ++i) f[0][i] = RMQ[i];
  for (int i = 1; (1 << i) <= tmp; ++i)
    for (int j = 1; j + (1 << i) - 1 <= tmp; ++j)
      f[i][j] = _min(f[i - 1][j], f[i - 1][j + (1 << (i - 1))]);
  for (int i = 1; i <= q; ++i) {
    int s = dread(), t = dread(), lca;
    if (graph[s] ^ graph[t]) ans = 0;
    lca = LCA(s = color[s], t = color[t]);
    ++up[s], --up[lca], --down[lca], ++down[t];
  }
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= tot; ++i)
    if (!vis[i]) dfs(i, 0);
}
inline void Zaychik() { puts(ans ? "Yes" : "No"); }
signed main() {
  Kaslana(), Raiden(), Zaychik();
  return 0;
}
