n, m, k = map(int, input().split())

# Создайте списки смежности для исходного и целевого графов
adjacency_list_original = [[] for _ in range(n)]
adjacency_list_target = [[] for _ in range(n)]

# Считайте рёбра исходного графа
for _ in range(m):
    u, v = map(int, input().split())
    adjacency_list_original[u - 1].append(v)
    adjacency_list_original[v - 1].append(u)

# Считайте рёбра целевого графа
for _ in range(k):
    u, v = map(int, input().split)
    adjacency_list_target[u - 1].append(v)
    adjacency_list_target[v - 1].append(u)

# Проверьте, что количество вершин совпадает
if n != n:
    print("NO")
else:
    # Проверьте, что количество рёбер совпадает
    if m != k:
        print("NO")
    else:
        # Создайте список действий Паши
        pashas_actions = []

        # Проверьте, что все рёбра целевого графа существуют в исходном графе
        for u in range(n):
            for v in adjacency_list_target[u]:
                if v not in adjacency_list_original[u]:
                    print("NO")
                    exit(0)
                # Найдите тройки вершин (a, b, c) для удаления соответствующих рёбер
                for w in adjacency_list_original[u]:
                    if w != v and w in adjacency_list_original[v]:
                        pashas_actions.append((u + 1, v, w))
                        # Удалите рёбра из списков смежности исходного графа
                        adjacency_list_original[u].remove(w)
                        adjacency_list_original[w].remove(u)
                        adjacency_list_original[v].remove(w)
                        adjacency_list_original[w].remove(v)

        # Выведите "YES", количество операций t и список действий Паши
        print("YES")
        print(len(pashas_actions))
        for action in pashas_actions:
            print(*action)
