#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
bool vis[MAXN], used[MAXN << 1];
int N, M, Q, dfn[MAXN], low[MAXN], num, _N, belong[MAXN];
stack<int> st;
struct edge {
  int nt, to;
} E1[MAXN << 2], E2[MAXN << 2];
int cnt1 = -1, head1[MAXN], head2[MAXN], cnt2 = -1;
void add1(int x, int y) {
  cnt1++;
  E1[cnt1].to = y;
  E1[cnt1].nt = head1[x];
  head1[x] = cnt1;
}
void add2(int x, int y) {
  cnt2++;
  E2[cnt2].to = y;
  E2[cnt2].nt = head2[x];
  head2[x] = cnt2;
}
struct lc {
  int dep[MAXN], fa[22][MAXN];
  void dfs(int n, int ff) {
    dep[n] = dep[ff] + 1;
    fa[0][n] = ff;
    for (int i = head2[n]; ~i; i = E2[i].nt) {
      int v = E2[i].to;
      if (v == ff)
        continue;
      else {
        dfs(v, n);
      }
    }
  }
  void ini() {
    for (int i = 1; i <= 20; i++) {
      for (int j = 1; j <= _N; j++) {
        fa[i][j] = fa[i - 1][fa[i - 1][j]];
      }
    }
  }
  int lca(int x, int y) {
    if (dep[x] < dep[y]) {
      swap(x, y);
    }
    int dis = dep[x] - dep[y];
    for (int i = 20; ~i; i--) {
      if (dis & (1LL << i)) {
        x = fa[i][x];
      }
    }
    if (x == y) return x;
    for (int i = 20; ~i; i--) {
      if (fa[i][x] != fa[i][y]) {
        x = fa[i][x];
        y = fa[i][y];
      }
    }
    return fa[0][x];
  }
} lca;
int up[MAXN], down[MAXN];
void dfs(int n, int ff) {
  for (int i = head2[n]; ~i; i = E2[i].nt) {
    int v = E2[i].to;
    if (v == ff) {
      continue;
    } else {
      dfs(v, n);
    }
    up[n] += up[v];
    down[n] += down[v];
  }
}
void tarjan(int, int);
int main() {
  memset(head1, -1, sizeof(head1));
  memset(head2, -1, sizeof(head2));
  scanf("%d%d%d", &N, &M, &Q);
  for (int i = 1, x, y; i <= M; i++) {
    scanf("%d%d", &x, &y);
    add1(x, y);
    add1(y, x);
  }
  for (int i = 1; i <= N; i++) {
    if (!dfn[i]) {
      tarjan(i, 0);
    }
  }
  for (int i = 1; i <= N; i++) {
    for (int j = head1[i]; ~j; j = E1[j].nt) {
      int v = E1[j].to;
      if (belong[v] != belong[i]) {
        add2(belong[i], belong[v]);
      }
    }
  }
  for (int i = 1; i <= _N; i++) {
    if (!lca.dep[i]) {
      add2(0, i);
      add2(i, 0);
      lca.dfs(i, 0);
    }
  }
  lca.ini();
  bool flag = 0;
  for (int i = 1, s, t; i <= Q; i++) {
    scanf("%d%d", &s, &t);
    s = belong[s];
    t = belong[t];
    up[s]++;
    down[t]++;
    int lcc = lca.lca(s, t);
    if (lcc == 0) flag = 1;
    up[lcc]--, down[lcc]--;
  }
  dfs(0, 2e5 + 5);
  for (int i = 1; i <= _N; i++) {
    if (down[i] && up[i]) {
      flag = 1;
      break;
    }
  }
  if (flag) {
    puts("No");
  } else {
    puts("Yes");
  }
  return 0;
}
void tarjan(int n, int ff) {
  dfn[n] = low[n] = ++num;
  st.push(n);
  for (int i = head1[n]; ~i; i = E1[i].nt) {
    int v = E1[i].to;
    if (used[i]) continue;
    used[i] = used[i ^ 1] = 1;
    if (vis[v]) continue;
    if (dfn[v]) {
      low[n] = min(low[n], dfn[v]);
    } else {
      tarjan(v, n);
      low[n] = min(low[n], low[v]);
    }
  }
  if (dfn[n] == low[n]) {
    _N++;
    int t;
    do {
      t = st.top();
      st.pop();
      belong[t] = _N;
      vis[t] = 1;
    } while (t != n);
  }
}
