#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char buf[1 << 14], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 14, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline long long read() {
  long long x = 0, f = 1;
  char c = gc();
  for (; !isdigit(c); c = gc()) {
    if (c == '-') f = -1;
    if (c == EOF) return EOF;
  }
  for (; isdigit(c); c = gc()) x = (x << 1) + (x << 3) + (c ^ 48);
  return x * f;
}
inline void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 | 48);
}
const long long N = 2e5 + 10;
stack<long long> S;
struct edge {
  long long to, net;
} e[N << 1];
long long edge, head[N], dfn[N], low[N], n, m, q, cnt, tot, color[N], up[N],
    down[N], f[N][30], dep[N], u[N], v[N], num, rt[N];
bool ins[N];
inline void addedge(long long x, long long y) {
  e[++edge].to = y, e[edge].net = head[x], head[x] = edge;
  e[++edge].to = x, e[edge].net = head[y], head[y] = edge;
}
inline long long bro(long long x) { return x & 1 ? x + 1 : x - 1; }
void tarjan(long long x, long long f) {
  low[x] = dfn[x] = ++cnt;
  S.push(x);
  ins[x] = 1;
  for (long long i = head[x]; i; i = e[i].net)
    if (bro(i) != f) {
      if (!dfn[e[i].to]) {
        tarjan(e[i].to, i);
        low[x] = min(low[x], low[e[i].to]);
      } else if (ins[e[i].to])
        low[x] = min(low[x], dfn[e[i].to]);
    }
  if (dfn[x] == low[x]) {
    ++tot;
    long long k;
    do {
      k = S.top();
      S.pop();
      color[k] = tot;
      ins[x] = 0;
    } while (k != x);
  }
}
void dfs(long long x, long long fa) {
  ins[x] = 1;
  for (long long i = head[x]; i; i = e[i].net)
    if (e[i].to != fa) {
      f[e[i].to][0] = x;
      dep[e[i].to] = dep[x] + 1;
      dfs(e[i].to, x);
    }
}
inline long long LCA(long long x, long long y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (long long i = 20; ~i; --i)
    if (dep[f[x][i]] >= dep[y]) x = f[x][i];
  if (x == y) return x;
  for (long long i = 20; ~i; --i)
    if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
  return f[x][0];
}
void dfs1(long long x) {
  ins[x] = 1;
  for (long long i = head[x]; i; i = e[i].net)
    if (!ins[e[i].to]) {
      dfs1(e[i].to);
      down[x] += down[e[i].to];
      up[x] += up[e[i].to];
    }
}
int main() {
  n = read(), m = read(), q = read();
  for (long long i = 1; i <= m; ++i) {
    u[i] = read(), v[i] = read();
    addedge(u[i], v[i]);
  }
  for (long long i = 1; i <= n; ++i)
    if (!dfn[i]) tarjan(i, 0);
  edge = cnt = 0;
  memset(head, 0, sizeof head);
  for (long long i = 1; i <= m; ++i)
    if (color[u[i]] != color[v[i]]) addedge(color[u[i]], color[v[i]]);
  memset(ins, 0, sizeof ins);
  for (long long i = 1; i <= tot; ++i)
    if (!ins[i]) {
      dep[i] = 1, dfs(i, 0);
      rt[++num] = i;
    }
  for (long long i = 1; i <= 20; ++i)
    for (long long j = 1; j <= tot; ++j) f[j][i] = f[f[j][i - 1]][i - 1];
  for (long long x, y; q; --q) {
    x = color[read()];
    y = color[read()];
    if (x == y) continue;
    long long t = LCA(x, y);
    ++down[y], --down[t];
    ++up[x], --up[t];
  }
  memset(ins, 0, sizeof ins);
  for (long long i = 1; i <= num; ++i) dfs1(rt[i]);
  for (long long i = 1; i <= tot; ++i)
    if (up[i] && down[i]) return puts("No"), 0;
  puts("Yes");
  return 0;
}
