#include <bits/stdc++.h>
using namespace std;
const int maxl = 2 * 1000 * 100 + 5;
const int maxlg = 22;
vector<pair<int, int> > adj[maxl];
vector<int> tree[maxl];
int n, m, q;
int mark[maxl], depth[maxl];
bool cut[maxl];
int dsu[maxl];
int arr[maxl];
int lca[maxl][maxlg];
int psum1[maxl], psum2[maxl];
bool flag = true;
int par(int index) {
  if (dsu[index] < 0) return index;
  return dsu[index] = par(dsu[index]);
}
inline void merge(int a, int b) {
  a = par(a);
  b = par(b);
  if (a == b) return;
  if (dsu[a] < dsu[b]) swap(a, b);
  dsu[b] += dsu[a];
  dsu[a] = b;
  return;
}
inline int getPar(int index, int x) {
  int ind = 0;
  while (x) {
    if (x & 1) index = lca[index][ind];
    ind++;
    x /= 2;
  }
  return index;
}
inline int Lca(int a, int b) {
  if (depth[a] < depth[b]) swap(a, b);
  a = getPar(a, depth[a] - depth[b]);
  if (a == b) return a;
  for (int i = maxlg - 1; i >= 0; i--)
    if (lca[a][i] != lca[b][i]) {
      a = lca[a][i];
      b = lca[b][i];
    }
  return lca[a][0];
}
int dfs_cut(int index, int par = -1) {
  mark[index] = 1;
  int mn = depth[index];
  for (int i = 0; i < adj[index].size(); i++) {
    int node = adj[index][i].first, edge = adj[index][i].second;
    if (mark[node] == 1 && edge != par) mn = min(mn, depth[node]);
    if (!mark[node]) {
      depth[node] = depth[index] + 1;
      int tmp = dfs_cut(node, edge);
      mn = min(mn, tmp);
      cut[edge] = (tmp >= depth[node]);
    }
  }
  mark[index] = 2;
  return mn;
}
void dfs(int index, int par = -1) {
  lca[index][0] = par;
  if (par == -1) lca[index][0] = index;
  for (int i = 0; i < tree[index].size(); i++) {
    int node = tree[index][i];
    if (node != par) {
      depth[node] = depth[index] + 1;
      dfs(node, index);
      psum1[index] += psum1[node];
      psum2[index] += psum2[node];
      if (psum1[node] && psum2[node]) flag = false;
    }
  }
}
int main() {
  memset(dsu, -1, sizeof dsu);
  memset(lca, -1, sizeof lca);
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--;
    b--;
    adj[a].push_back(make_pair(b, i));
    adj[b].push_back(make_pair(a, i));
  }
  for (int i = 0; i < n; i++)
    if (!mark[i]) dfs_cut(i);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < adj[i].size(); j++) {
      int node = adj[i][j].first, edge = adj[i][j].second;
      if (!cut[edge]) merge(i, node);
    }
  for (int i = 0; i < n; i++) arr[i] = par(i);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < adj[i].size(); j++) {
      int node = adj[i][j].first, edge = adj[i][j].second;
      merge(i, node);
      int x = arr[i], y = arr[node];
      if (x == y) continue;
      tree[x].push_back(y);
    }
  memset(depth, 0, sizeof depth);
  for (int i = 0; i < n; i++)
    if (arr[i] == i && lca[i][0] == -1) dfs(i);
  for (int j = 1; j < maxlg; j++)
    for (int i = 0; i < n; i++)
      if (arr[i] == i) lca[i][j] = lca[lca[i][j - 1]][j - 1];
  for (int i = 0; i < q; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    x--;
    y--;
    x = arr[x];
    y = arr[y];
    if (par(x) != par(y)) {
      flag = false;
      continue;
    }
    int node = Lca(x, y);
    psum1[x]++;
    psum1[node]--;
    psum2[y]++;
    psum2[node]--;
  }
  for (int i = 0; i < n; i++)
    if (arr[i] == i && lca[i][0] == i) dfs(i);
  if (flag)
    printf("Yes\n");
  else
    printf("No\n");
}
