#include<bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
using namespace std;
void print(const vector<int> &a) {
int n = a.size();
cout << n << endl;
rep(i, n) {
cout << a[i];
if (i == n - 1) cout << endl;
else cout << " ";
}
}
vector<vector<int>> G;
int main() {
int n, m; cin >> n >> m;
G.resize(n + 1);
rep(i, m) {
int u, v; cin >> u >> v;
G[u].push_back(v); G[v].push_back(u);
}
if (m > n - 1) {
cout << "NO" << endl; return 0;
}
rep1(i, n) {
int cnt = 0;
for (int nex : G[i]) {
for (int chi : G[nex]) if (chi != i) {
if (G[chi].size() > 1) {
cnt++; break;
}
}
}
if (cnt >= 3) {
cout << "NO" << endl; return 0;
}
}
cout << "YES" << endl;
vector<int> res;
int u = 1, v = 1;
vector<int> d1(n + 1, -1), du(n + 1, -1);
queue<int> todo;
d1[1] = 0; todo.push(1);
while (!todo.empty()) {
int now = todo.front(); todo.pop(); u = now;
for (int nex : G[now]) {
if (d1[nex] == -1) {
d1[nex] = d1[now] + 1; todo.push(nex);
}
}
}
du[u] = 0; todo.push(u);
while (!todo.empty()) {
int now = todo.front(); todo.pop(); v = now;
for (int nex : G[now]) {
if (du[nex] == -1) {
du[nex] = du[now] + 1; todo.push(nex);
}
}
}
//cerr << u << " " << v << endl;
int pre = v, cur = G[v][0];
while (1) {
if (cur == u) break; res.push_back(cur);
for (int nex : G[cur]) {
if (nex == pre) continue;
if (du[nex] > du[cur] && G[nex].size() > 1) {
res.push_back(nex); res.push_back(cur);
}
}
for (int nex : G[cur]) if (du[nex] == du[cur] - 1) {
pre = cur; cur = nex; break;
}
}
if (res.size() % 2 == 0) {
pre = -1; cur = v;
}
else {
pre = v, cur = G[v][0];
}
while (1) {
if (cur == u) break; res.push_back(cur);
for (int nex : G[cur]) {
if (nex == pre) continue;
if (du[nex] > du[cur] && G[nex].size() > 1) {
res.push_back(nex); res.push_back(cur);
}
}
for (int nex : G[cur]) if (du[nex] == du[cur] - 1) {
pre = cur; cur = nex; break;
}
}
print(res);
}