def is_possible_to_transform_graph(n, m, k, edges_original, edges_target):
    # Проверяем, что каждая вершина исходного графа удовлетворяет условиям 1 и 2
    for i in range(1, n + 1):
        neighbors_original = set()
        neighbors_target = set()
        for u, v in edges_original:
            if u == i:
                neighbors_original.add(v)
            if v == i:
                neighbors_original.add(u)
        for u, v in edges_target:
            if u == i:
                neighbors_target.add(v)
            if v == i:
                neighbors_target.add(u)
        if neighbors_original != neighbors_target:
            return "NO"

    # Проверяем, что для каждой пары вершин (a, b) в заданном графе существует тройка вершин (a, b, c)
    actions = []
    for a, b in edges_target:
        c = None
        for i in range(1, n + 1):
            if i != a and i != b:
                c = i
                break
        actions.append((a, b, c))

    return "YES", len(actions), actions

# Чтение входных данных
n, m, k = map(int, input().split())
edges_original = [tuple(map(int, input().split())) for _ in range(m)]
edges_target = [tuple(map(int, input().split())) for _ in range(k)]

# Вызов функции и вывод результата
result = is_possible_to_transform_graph(n, m, k, edges_original, edges_target)
print(result)
