#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

#pragma GCC optimize("03")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,bmi2,fma")

using namespace std;
//using namespace __gnu_pbds;

//gp_gash_table<int,int>mp;
#define ll long long
#define pb push_back
#define ld long double
#define endl '/n'
#define all(a) a.begin(), a.end()

const ll INF = 2e18, MOD = 1e9 + 7, MAXN = 2e5;
vector<int> p;
vector<set<int>> vec;
vector<int> used;



void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    set<pair<int, int>> ish, kon;
    vec.resize(n);
    used.resize(n, 0);
    for (int i = 0; i < m; i++) {
        int v, u;
        cin >> v >> u;
        v--;
        u--;
        if (v > u) {
            swap(v, u);
        }
        ish.insert({v, u});
    }
    for (int i = 0; i < k; i++) {
        int v, u;
        cin >> v >> u;
        v--;
        u--;
        if (v > u) {
            swap(v, u);
        }
        kon.insert({v, u});
    }
    for (pair<int, int> i : ish) {
        if (kon.find(i) == kon.end()) {
            vec[i.first].insert(i.second);
            vec[i.second].insert(i.first);
        }
    }
    for (pair<int, int> i : kon) {
        if (ish.find(i) == ish.end()) {
            vec[i.first].insert(i.second);
            vec[i.second].insert(i.first);
        }
    }
    for (int i = 0; i < n; i++) {
        if (vec[i].size() % 2 != 0) {
            cout << "NO\n";
            return;
        }
    }
    set<pair<int, int>> s;
    vector<vector<int>> ans;
    for (int i = 0; i < n; i++) {
        s.insert({vec[i].size(), i});
    }
    while (!s.empty()) {
        int a = (*s.begin()).second;
        int skok = (*s.begin()).first;
        s.erase(s.begin());
        if (skok == 0) {
            continue;
        }
        int b = (*vec[a].begin());
        vec[a].erase(vec[a].begin());
        int c = *vec[a].begin();
        vec[a].erase(vec[a].begin());

        s.erase(s.find({vec[c].size(), c}));
        s.erase(s.find({vec[b].size(), b}));
        vec[b].erase(vec[b].find(a));
        vec[c].erase(vec[c].find(a));
        if (vec[c].find(b) == vec[c].end()) {
            vec[c].insert(b);
            vec[b].insert(c);
            s.insert({vec[c].size(), c});
            s.insert({vec[b].size(), b});
        } else {
            vec[c].erase(vec[c].find(b));
            vec[b].erase(vec[b].find(c));
            s.insert({vec[c].size(), c});
            s.insert({vec[b].size(), b});
        }
        s.insert({vec[a].size(), a});
        ans.push_back({a, b, c});
    }
    cout << "YES\n" << ans.size() << "\n";
    for (vector<int> i : ans) {
        cout << i[0] + 1 << " " << i[1] + 1 << " " << i[2] + 1 << "\n";
    }
}

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll t = 1;
    // cin >> t;
    while(t--) {
        solve();
    }
}