#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, mod = 1e9 + 7, Lg = 18;
int t, c[N], fix[N], tmin[N], tmout[N], first[N][2], par[N], p[N], timer,
    up[N][20], n, m, q, upmost[N], h[N];
vector<pair<int, int> > V[N];
vector<int> comp[N];
string ans;
void merge(int u, int v) {
  u = par[u];
  v = par[v];
  if (comp[u].size() < comp[v].size()) swap(u, v);
  for (int i = 0; i < comp[v].size(); i++) {
    par[comp[v][i]] = u;
    comp[u].push_back(comp[v][i]);
  }
  if (h[upmost[v]] < h[upmost[u]]) upmost[u] = upmost[v];
}
void dfs(int u, int e, int C) {
  c[u] = C;
  fix[u] = 1;
  tmin[u] = ++timer;
  for (int i = 0; i < V[u].size(); i++) {
    if (V[u][i].second == e) continue;
    int v = V[u][i].first;
    if (fix[v] && tmin[v] < tmin[u]) {
      int cur = upmost[par[u]];
      while (true) {
        if (h[cur] <= h[v] || par[cur] == par[p[cur]]) break;
        merge(cur, p[cur]);
        cur = upmost[par[cur]];
      }
      continue;
    }
    p[v] = u;
    h[v] = h[u] + 1;
    dfs(v, V[u][i].second, C);
  }
}
void dfs2(int u, int p) {
  fix[u] = 2;
  tmin[u] = ++timer;
  up[u][0] = p;
  for (int i = 1; i <= Lg; i++) up[u][i] = up[up[u][i - 1]][i - 1];
  for (int i = 0; i < V[u].size(); i++) {
    if (V[u][i].first != p) {
      dfs2(V[u][i].first, u);
    }
  }
  tmout[u] = timer;
}
void dfs3(int u, int p) {
  fix[u] = 3;
  for (int i = 0; i < V[u].size(); i++) {
    if (V[u][i].first != p) {
      dfs3(V[u][i].first, u);
      for (int j = 0; j < 2; j++) first[u][j] += first[V[u][i].first][j];
    }
  }
  if (first[u][0] && first[u][1]) ans = "No";
}
bool check(int u, int v) {
  if (tmin[u] <= tmin[v] && tmout[v] <= tmout[u]) return 1;
  return 0;
}
int findLca(int u, int v) {
  if (check(u, v)) return u;
  if (check(v, u)) return v;
  for (int i = Lg; i >= 0; i--) {
    if (up[u][i] && !check(up[u][i], v)) u = up[u][i];
  }
  return up[u][0];
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> q;
  vector<pair<int, int> > Edges;
  for (int i = 1; i <= n; i++) par[i] = i, comp[i].push_back(i), upmost[i] = i;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    V[u].push_back({v, i});
    V[v].push_back({u, i});
    Edges.push_back({u, v});
  }
  int cur = 0;
  for (int i = 1; i <= n; i++) {
    if (!fix[i]) {
      dfs(i, 0, ++cur);
    }
    V[i].clear();
  }
  timer = 0;
  for (int i = 0; i < Edges.size(); i++) {
    int u = Edges[i].first;
    int v = Edges[i].second;
    if (par[u] == par[v]) continue;
    V[par[u]].push_back({par[v], 0});
    V[par[v]].push_back({par[u], 0});
  }
  for (int i = 1; i <= n; i++) {
    if (fix[i] != 2) {
      dfs2(i, 0);
    }
  }
  ans = "Yes";
  while (q--) {
    int u, v;
    cin >> u >> v;
    u = par[u];
    v = par[v];
    if (c[u] != c[v])
      ans = "No";
    else {
      int lca = findLca(u, v);
      first[lca][0]--;
      first[lca][1]--;
      first[u][0]++;
      first[v][1]++;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (fix[i] != 3) {
      dfs3(i, 0);
    }
  }
  cout << ans;
}
