#include <bits/stdc++.h>
using namespace std;
inline int read(int f = 1, int x = 0, char ch = ' ') {
  while (!isdigit(ch = getchar()))
    if (ch == '-') f = -1;
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f * x;
}
const int N = 2e5 + 5;
int n, m, fa[N], vis[N], u[N], v[N], h[N], nxt[N << 1], to[N << 1], dep[N],
    p[N], ins[N];
void add(int x, int y) {
  static int tot = 0;
  nxt[++tot] = h[x], to[tot] = y, h[x] = tot;
}
void work(int a, int b, int c, int d) {
  if (dep[a] > dep[c]) swap(a, c), swap(b, d);
  int e = c, l = 0;
  puts("YES");
  for (; dep[e] > dep[a]; e = fa[e])
    ;
  for (int f = a; e != f; e = fa[e], f = fa[f])
    ;
  if (dep[b] > dep[d]) swap(a, c), swap(b, d);
  for (int x = e; p[++l] = x, x != d; x = fa[x])
    ;
  printf("%d ", l);
  for (int i = 1; i <= l; ++i) printf("%d ", p[i]);
  puts(""), l = 0;
  for (int x = d; p[++l] = x, x != b; x = fa[x])
    ;
  for (int x = a; p[++l] = x, x != e; x = fa[x])
    ;
  printf("%d ", l);
  while (l) printf("%d ", p[l--]);
  puts("");
  p[++l] = d;
  for (int x = c; p[++l] = x, x != e; x = fa[x])
    ;
  printf("%d ", l);
  while (l) printf("%d ", p[l--]);
  puts("");
  exit(0);
}
void dfs(int x) {
  vis[x] = 1, dep[x] = dep[fa[x]] + 1, ins[x] = 1;
  for (int i = h[x], y; i; i = nxt[i])
    if ((y = to[i]) != fa[x]) {
      if (!vis[y = to[i]])
        fa[y] = x, dfs(y);
      else if (ins[y])
        for (int z = x; z != y; z = fa[z]) {
          if (u[z])
            work(u[z], v[z], x, y);
          else
            u[z] = x, v[z] = y;
        }
    }
  ins[x] = 0;
}
int main() {
  n = read(), m = read();
  for (int i = 1, x, y; i <= m; ++i)
    x = read(), y = read(), add(x, y), add(y, x);
  for (int i = 1; i <= n; ++i)
    if (!vis[i]) dfs(i);
  puts("NO");
  return 0;
}
