#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 );   }