def find_actions(n, m, k, edges_orig, edges_new):
    # Создаем множества для хранения ребер полученного и исходного графов
    edges_set_orig = set(edges_orig)
    edges_set_new = set(edges_new)

    # Проверяем, являются ли графы изначально эквивалентными
    if edges_set_orig == edges_set_new:
        return "YES\n0"

    # Пробуем применить операцию для каждого возможного набора трех вершин
    for a in range(1, n+1):
        for b in range(1, n+1):
            for c in range(1, n+1):
                # Пропускаем случаи, когда вершины повторяются
                if a == b or a == c or b == c:
                    continue

                # Создаем временные множества, чтобы сохранить уникальные ребра для проверки
                temp_edges_orig = set(edges_orig)
                temp_edges_new = set(edges_new)

                # Применяем операцию для каждой пары вершин
                temp_edges_orig = remove_add_edge(temp_edges_orig, a, b)
                temp_edges_orig = remove_add_edge(temp_edges_orig, b, c)
                temp_edges_orig = remove_add_edge(temp_edges_orig, a, c)

                # Если полученные ребра совпадают с ребрами нового графа, возвращаем результат
                if temp_edges_orig == edges_set_new:
                    return f"YES\n1\n{a} {b} {c} "

    return "NO"


def remove_add_edge(edges, a, b):
    # Если ребро существует, удаляем его; если не существует, добавляем
    if (a, b) in edges:
        edges.remove((a, b))
    else:
        edges.add((a, b))
    return edges


# Считываем входные данные
n, m, k = map(int, input().split())
edges_orig = [tuple(map(int, input().split())) for _ in range(m)]
edges_new = [tuple(map(int, input().split())) for _ in range(k)]

# Вызываем функцию для поиска действий Паши
result = find_actions(n, m, k, edges_orig, edges_new)

# Выводим результат
print(result)