Skip to content
c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200005, M = 400005, LOG = 20;
struct Edge {
    int u, v;
} e[M >> 1];
int n, m, q;
int head[N], to[M], nxt[M], cnt = 2;
int dfn[N], low[N], tot;
int stk[N], top;
int bel[N], ebcc_cnt;
int aup[N], down[N];
int block[N];
void add(int u, int v) { to[cnt] = v, nxt[cnt] = head[u], head[u] = cnt++; }

void tarjan(int u, int in_edge, int bk) {
    block[u] = bk;
    dfn[u] = low[u] = ++tot;
    stk[++top] = u;
    for (int i = head[u]; i; i = nxt[i]) {
        if (i == (in_edge ^ 1)) continue;
        int v = to[i];
        if (!dfn[v]) {
            tarjan(v, i, bk);
            low[u] = min(low[u], low[v]);
        } else {
            low[u] = min(low[u], dfn[v]);
        }
    }
    if (dfn[u] == low[u]) {
        ++ebcc_cnt;
        do {
            bel[stk[top]] = ebcc_cnt;
        } while (stk[top--] != u);
    }
}
vector<int> g[N];
int dep[N], up[N][LOG];

void dfs1(int u, int p) {
    dep[u] = dep[p] + 1;
    up[u][0] = p;
    for (int i = 1; i < LOG; ++i) up[u][i] = up[up[u][i - 1]][i - 1];
    for (int v : g[u])
        if (v != p) dfs1(v, u);
}

int lca(int u, int v) {
    if (dep[u] < dep[v]) swap(u, v);
    int d = dep[u] - dep[v];
    for (int i = 0; i < LOG; ++i)
        if ((d >> i) & 1) u = up[u][i];
    if (u == v) return u;
    for (int i = LOG - 1; i >= 0; --i)
        if (up[u][i] != up[v][i]) u = up[u][i], v = up[v][i];
    return up[u][0];
}
void add_edge(int u, int v) {
    g[u].push_back(v);
    g[v].push_back(u);
}

void dfs2(int u, int f) {
    for (int v : g[u]) {
        if (v == f) continue;
        dfs2(v, u);
        aup[u] += aup[v];
        down[u] += down[v];
    }
}
void fc() {
    std::cin >> n >> m >> q;
    for (int i = 0; i < m; i++) {
        std::cin >> e[i].u >> e[i].v;
        add(e[i].u, e[i].v);
        add(e[i].v, e[i].u);
    }

    for (int i = 1; i <= n; i++)
        if (!dfn[i]) tarjan(i, 0, i);

    for (int i = 0; i < m; i++) {
        int u = bel[e[i].u], v = bel[e[i].v];
        if (u == v) continue;
        add_edge(u, v);
    }
    std::vector<int>c;
    for (int i = 1; i <= ebcc_cnt; i++)
        if (!dep[i]) dfs1(i, 0),c.push_back(i);
    while (q--) {
        int u, v;
        std::cin >> u >> v;
        if (block[u] != block[v]) {
            std::cout << "NO\n";
            return;
        }
        u = bel[u], v = bel[v];

        int f = lca(u, v);
        aup[u]++;
        aup[f]--;
        down[v]++;
        down[f]--;
    }

    for(int u:c)dfs2(u,0);

    for (int i = 1; i <= ebcc_cnt; i++)
        if (aup[i] && down[i]) {
            std::cout << "No\n";
            return;
        }
    std::cout << "Yes\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // std::cin>>t;
    while (t--) fc();
    return 0;
}