#include <bits/stdc++.h>
using namespace std;
inline int read() {
  char c = getchar();
  int x = 0;
  bool f = 0;
  for (; !isdigit(c); c = getchar()) f ^= !(c ^ 45);
  for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  if (f) x = -x;
  return x;
}
int n, m;
vector<int> e[200005];
int fa[200005], dep[200005], xx[200005], yy[200005];
bool vis[200005], ins[200005];
inline int lca(int u, int v) {
  while (dep[u] > dep[v]) u = fa[u];
  while (dep[v] > dep[u]) v = fa[v];
  while (u != v) u = fa[u], v = fa[v];
  return u;
}
vector<int> split(int u, int v) {
  vector<int> o;
  bool rev = (dep[u] < dep[v]);
  if (rev) swap(u, v);
  while (u != v) o.push_back(u), u = fa[u];
  o.push_back(v);
  if (rev) reverse(o.begin(), o.end());
  return o;
}
vector<int> add(vector<int> a, vector<int> b) {
  vector<int> c;
  for (auto x : a) c.push_back(x);
  for (auto x : b) c.push_back(x);
  return c;
}
void print(vector<int> o) {
  cout << o.size() << ' ';
  for (int i = 0; i < o.size(); ++i)
    if (!i || (i && o[i] != o[i - 1])) cout << o[i] << ' ';
  puts("");
}
void work(int u, int v, int x, int y) {
  puts("YES");
  if (dep[v] > dep[y]) swap(v, y), swap(u, x);
  int a = lca(u, x);
  print(split(a, y));
  print(add(split(a, x), vector<int>{y}));
  print(add(split(a, u), split(v, y)));
  exit(0);
}
void dfs(int u, int pa) {
  fa[u] = pa, dep[u] = dep[pa] + 1, ins[u] = 1, vis[u] = 1;
  for (auto v : e[u]) {
    if (v == pa) continue;
    if (!vis[v])
      dfs(v, u);
    else if (ins[v]) {
      for (int x = u; x != v; x = fa[x])
        if (xx[x])
          work(xx[x], yy[x], u, v);
        else
          xx[x] = u, yy[x] = v;
    }
  }
  ins[u] = 0;
}
signed main() {
  n = read(), m = read();
  for (register int i = (1); i <= (m); ++i) {
    int u = read(), v = read();
    e[u].push_back(v), e[v].push_back(u);
  }
  for (register int i = (1); i <= (n); ++i)
    if (!vis[i]) dfs(i, 0);
  puts("NO");
  return 0;
}
