#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> graph;
vector<int> used, path;
int flag, n, m;
// поиск в глубину для каждой вершины
void dfs (int v) {
if (flag == 1) return; // если уже нашли цикл, то останавливаемся
else {
used[v] = 1; // посещаем вершину
path.push_back(v); // добавляем ее в порядок обхода графа
for (int i = 0; i < graph[v].size(); i++) {
int to = graph[v][i];// следующая вершина графа
if (used[to] == 1) { // если мы ее посетили, но не вышли из нее, значит мы нашли цикл
path.push_back(to); // добавляем следующую вершину в порядок обхода графа
flag = 1; // ставим индикатор, что мы нашли цикл и останавливаемся
return;
}
else {
dfs(to); // если не посетили, то посещаем
}
if (flag == 1) return; // если нашли цикл, то останавливаемся
}
used[v] = 2; // если не нашли цикл, то выходим из вершины
path.pop_back();
}
}
// проверяем вершины на наличие цикла
void checkNodes() {
for (int i = 1; i <= n; i++) {
if (used[i] == 0) { // если не посещали вершину, то посещаем ее
dfs(i);
if (flag == 1) return; // если нашли цикл, то останавливаемся
}
}
}
int main(){
int v1, v2;
cin >> n >> m; // считываем количество вершин и ребер
graph.resize(n + 1);
used.resize(n + 1, 0);
for (int i = 0; i < m; i++) {
cin >> v1 >> v2; // считываем ребра и заполняем граф
graph[v1].push_back(v2);
}
checkNodes(); // проверяем вершины на наличие цикла
if (flag == 1) { // если цикл найден
int i = path.size() - 2; // последняя вершина цикла
int to = path.back(); // вершина в которой зациклились
while (path[i] != to) { // получаем индекс вершины в которой зациклились
i--;
}
cout << "YES" << endl;
while (i < path.size() - 1) { // выводим сам цикл
cout << path[i] << " ";
i++;
}
cout << endl;
}
else cout << "NO" << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2ZWN0b3I8dmVjdG9yPGludD4+IGdyYXBoOyAKdmVjdG9yPGludD4gdXNlZCwgcGF0aDsKaW50IGZsYWcsIG4sIG07Ci8vINC/0L7QuNGB0Log0LIg0LPQu9GD0LHQuNC90YMg0LTQu9GPINC60LDQttC00L7QuSDQstC10YDRiNC40L3Riwp2b2lkIGRmcyAoaW50IHYpIHsKICBpZiAoZmxhZyA9PSAxKSByZXR1cm47IC8vINC10YHQu9C4INGD0LbQtSDQvdCw0YjQu9C4INGG0LjQutC7LCDRgtC+INC+0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC80YHRjwogIGVsc2UgewoJICB1c2VkW3ZdID0gMTsgLy8g0L/QvtGB0LXRidCw0LXQvCDQstC10YDRiNC40L3RgyAKCSAgcGF0aC5wdXNoX2JhY2sodik7IC8vINC00L7QsdCw0LLQu9GP0LXQvCDQtdC1INCyINC/0L7RgNGP0LTQvtC6INC+0LHRhdC+0LTQsCDQs9GA0LDRhNCwCgkgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JhcGhbdl0uc2l6ZSgpOyBpKyspIHsKCSAgICBpbnQgdG8gPSBncmFwaFt2XVtpXTsvLyDRgdC70LXQtNGD0Y7RidCw0Y8g0LLQtdGA0YjQuNC90LAg0LPRgNCw0YTQsAoJICAgIGlmICh1c2VkW3RvXSA9PSAxKSB7IC8vINC10YHQu9C4INC80Ysg0LXQtSDQv9C+0YHQtdGC0LjQu9C4LCDQvdC+INC90LUg0LLRi9GI0LvQuCDQuNC3INC90LXQtSwg0LfQvdCw0YfQuNGCINC80Ysg0L3QsNGI0LvQuCDRhtC40LrQuwoJICAgICAgcGF0aC5wdXNoX2JhY2sodG8pOyAvLyDQtNC+0LHQsNCy0LvRj9C10Lwg0YHQu9C10LTRg9GO0YnRg9GOINCy0LXRgNGI0LjQvdGDINCyINC/0L7RgNGP0LTQvtC6INC+0LHRhdC+0LTQsCDQs9GA0LDRhNCwCgkgICAgICBmbGFnID0gMTsgLy8g0YHRgtCw0LLQuNC8INC40L3QtNC40LrQsNGC0L7RgCwg0YfRgtC+INC80Ysg0L3QsNGI0LvQuCDRhtC40LrQuyDQuCDQvtGB0YLQsNC90LDQstC70LjQstCw0LXQvNGB0Y8KCSAgICAgIHJldHVybjsKCSAgICB9IAoJICAgIGVsc2UgewoJICAgIAlkZnModG8pOyAvLyDQtdGB0LvQuCDQvdC1INC/0L7RgdC10YLQuNC70LgsINGC0L4g0L/QvtGB0LXRidCw0LXQvCAKCSAgICB9CgkgICAgaWYgKGZsYWcgPT0gMSkgcmV0dXJuOyAvLyDQtdGB0LvQuCDQvdCw0YjQu9C4INGG0LjQutC7LCDRgtC+INC+0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC80YHRjyAKCSAgfQoJICB1c2VkW3ZdID0gMjsgLy8g0LXRgdC70Lgg0L3QtSDQvdCw0YjQu9C4INGG0LjQutC7LCDRgtC+INCy0YvRhdC+0LTQuNC8INC40Lcg0LLQtdGA0YjQuNC90YsgCgkgIHBhdGgucG9wX2JhY2soKTsKICB9Cn0gCi8vINC/0YDQvtCy0LXRgNGP0LXQvCDQstC10YDRiNC40L3RiyDQvdCwINC90LDQu9C40YfQuNC1INGG0LjQutC70LAgCnZvaWQgY2hlY2tOb2RlcygpIHsgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCSAgICBpZiAodXNlZFtpXSA9PSAwKSB7IC8vINC10YHQu9C4INC90LUg0L/QvtGB0LXRidCw0LvQuCDQstC10YDRiNC40L3Rgywg0YLQviDQv9C+0YHQtdGJ0LDQtdC8INC10LUgCgkgICAgICAgIGRmcyhpKTsKCSAgICAJaWYgKGZsYWcgPT0gMSkgcmV0dXJuOyAvLyDQtdGB0LvQuCDQvdCw0YjQu9C4INGG0LjQutC7LCDRgtC+INC+0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC80YHRjwoJICAgIH0JCgl9Cn0gCmludCBtYWluKCl7CglpbnQgdjEsIHYyOyAKCWNpbiA+PiBuID4+IG07IC8vINGB0YfQuNGC0YvQstCw0LXQvCDQutC+0LvQuNGH0LXRgdGC0LLQviDQstC10YDRiNC40L0g0Lgg0YDQtdCx0LXRgCAKCWdyYXBoLnJlc2l6ZShuICsgMSk7IAoJdXNlZC5yZXNpemUobiArIDEsIDApOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCSAgY2luID4+IHYxID4+IHYyOyAvLyDRgdGH0LjRgtGL0LLQsNC10Lwg0YDQtdCx0YDQsCDQuCDQt9Cw0L/QvtC70L3Rj9C10Lwg0LPRgNCw0YQKCSAgZ3JhcGhbdjFdLnB1c2hfYmFjayh2Mik7Cgl9CgljaGVja05vZGVzKCk7ICAvLyDQv9GA0L7QstC10YDRj9C10Lwg0LLQtdGA0YjQuNC90Ysg0L3QsCDQvdCw0LvQuNGH0LjQtSDRhtC40LrQu9CwCglpZiAoZmxhZyA9PSAxKSB7IC8vINC10YHQu9C4INGG0LjQutC7INC90LDQudC00LXQvQoJICAgIGludCBpID0gcGF0aC5zaXplKCkgLSAyOyAvLyDQv9C+0YHQu9C10LTQvdGP0Y8g0LLQtdGA0YjQuNC90LAg0YbQuNC60LvQsCAgIAoJICAgIGludCB0byA9IHBhdGguYmFjaygpOyAvLyDQstC10YDRiNC40L3QsCDQsiDQutC+0YLQvtGA0L7QuSDQt9Cw0YbQuNC60LvQuNC70LjRgdGMIAoJICAgIHdoaWxlIChwYXRoW2ldICE9IHRvKSB7IC8vINC/0L7Qu9GD0YfQsNC10Lwg0LjQvdC00LXQutGBINCy0LXRgNGI0LjQvdGLINCyINC60L7RgtC+0YDQvtC5INC30LDRhtC40LrQu9C40LvQuNGB0YwKCSAgICAJaS0tOwoJICAgIH0KCSAgICBjb3V0IDw8ICJZRVMiIDw8IGVuZGw7CgkgICAgd2hpbGUgKGkgPCBwYXRoLnNpemUoKSAtIDEpIHsgLy8g0LLRi9Cy0L7QtNC40Lwg0YHQsNC8INGG0LjQutC7CgkJICAgIGNvdXQgPDwgcGF0aFtpXSA8PCAiICI7CgkgICAgCWkrKzsgCgkgICAgfQoJICAgIGNvdXQgPDwgZW5kbDsKCSAgfQoJICBlbHNlIGNvdXQgPDwgIk5PIiA8PCBlbmRsOwp9