#include <bits/stdc++.h>
using namespace std;
const int Mod = (int)1e9 + 7;
const int MX = 1073741822;
const long long MXLL = 4e18;
const int Sz = 1110111;
inline void Read_rap() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
inline void randomizer3000() {
  unsigned int seed;
  asm("rdtsc" : "=A"(seed));
  srand(seed);
}
void files(string problem) {
  if (fopen((problem + ".in").c_str(), "r")) {
    freopen((problem + ".in").c_str(), "r", stdin);
    freopen((problem + ".out").c_str(), "w", stdout);
  }
}
void localInput(string in = "s") {
  if (fopen(in.c_str(), "r"))
    freopen(in.c_str(), "r", stdin);
  else
    cerr << "Input file not found" << endl;
}
int n, m;
const int N = 2e5 + 1;
vector<int> g[Sz];
set<int> br[Sz];
int c[Sz];
int fup[Sz], tin[Sz], timer;
int p[Sz], P;
int used[Sz];
int q;
vector<int> path[Sz];
map<pair<int, int>, int> cnt;
void dfsBr(int v, int pr) {
  fup[v] = tin[v] = ++timer;
  c[v] = c[pr];
  for (int to : g[v]) {
    if (to == pr) continue;
    if (c[to] == c[v]) {
      fup[v] = min(fup[v], tin[to]);
    } else {
      dfsBr(to, v);
      fup[v] = min(fup[v], fup[to]);
      if (fup[to] > tin[v] && cnt[make_pair(v, to)] == 1) {
        br[v].insert(to);
        br[to].insert(v);
      }
    }
  }
}
void dfsDiv(int v) {
  p[v] = P;
  for (int to : g[v]) {
    if (br[v].count(to)) continue;
    if (!p[to]) dfsDiv(to);
  }
}
void Divide() {
  int comp = 0;
  for (int i = 1; i <= n; i++) {
    if (!c[i]) {
      c[i] = ++comp;
      dfsBr(i, i);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!p[i]) {
      P++;
      dfsDiv(i);
    }
  }
}
struct tree {
  int in[N], out[N], ord;
  vector<int> g[Sz];
  int up[18][N];
  int sum[2][N];
  void pre_dfs(int v, int pr) {
    in[v] = ++ord;
    up[0][v] = pr;
    for (int i = 1; i <= 17; i++) up[i][v] = up[i - 1][up[i - 1][v]];
    for (int to : g[v])
      if (to != pr) pre_dfs(to, v);
    out[v] = ord;
  }
  bool upper(int u, int v) { return (in[u] <= in[v] && out[v] <= out[u]); }
  int lca(int x, int y) {
    if (upper(x, y)) return x;
    if (upper(y, x)) return y;
    for (int i = 17; i >= 0; i--)
      if (!upper(up[i][x], y)) x = up[i][x];
    return up[0][x];
  }
  inline void add(int l, int r, int tp) {
    sum[tp][l]--;
    sum[tp][r]++;
  }
  bool solve(int v = 1, int pr = 1) {
    for (int to : g[v]) {
      if (to == pr) continue;
      if (!solve(to, v)) return 0;
      for (int i = 0; i < 2; i++) sum[i][v] += sum[i][to];
    }
    if (sum[0][v] && sum[1][v]) {
      return 0;
    }
    return 1;
  }
  void add_edge(int x, int y) {
    g[x].push_back(y);
    g[y].push_back(x);
  }
} T;
void Build() {
  for (int i = 1; i <= n; i++) {
    for (int j : br[i]) {
      int x = p[i];
      int y = p[j];
      if (x < y) T.add_edge(x, y);
    }
  }
  T.pre_dfs(1, 1);
}
int main() {
  localInput();
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
    cnt[make_pair(x, y)]++;
    cnt[make_pair(y, x)]++;
  }
  Divide();
  Build();
  for (int i = 1; i <= q; i++) {
    int s, t;
    scanf("%d %d", &s, &t);
    if (c[s] != c[t]) {
      cout << "No";
      return 0;
    }
    s = p[s];
    t = p[t];
    int l = T.lca(s, t);
    T.add(l, s, 0);
    T.add(l, t, 1);
  }
  cout << (T.solve() ? "Yes" : "No");
  return 0;
}
