#include <bits/stdc++.h>
using namespace std;
const int M = 2e5 + 7;
inline int ri() {
  int x = 0;
  bool f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = 0;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;
  return f ? x : -x;
}
int n, m;
struct vec {
  int g[M], te;
  struct edge {
    int y, nxt;
    edge(int _y = 0, int _nxt = 0) { y = _y, nxt = _nxt; }
  } e[M << 1];
  void clear() {
    memset(g, 0, sizeof g);
    te = 0;
  }
  vec() { clear(); }
  inline void push(int x, int y) {
    e[++te] = edge(y, g[x]);
    g[x] = te;
  }
  inline void push2(int x, int y) {
    push(x, y);
    push(y, x);
  }
  inline int& operator()(int x) { return g[x]; }
  inline edge& operator[](int x) { return e[x]; }
};
namespace G {
vec e;
int cyc[M];
int pre[M], dep[M];
vector<int> q, p;
void travel(vector<int>& q, int fl) {
  int i;
  if (fl == 1)
    for (i = 0; i < q.size(); i++) printf(" %d", q[i]);
  if (fl == -1)
    for (i = q.size() - 1; i >= 0; i--) printf(" %d", q[i]);
}
void solve(int s, int v, int t) {
  int x, y, to;
  puts("YES");
  bool up = 1;
  for (x = s; up; x = cyc[x])
    if (dep[cyc[x]] < dep[x]) up = 0;
  y = x;
  to = dep[y] > dep[t] ? y : t;
  q.clear();
  for (x = s; x != to; x = pre[x]) q.push_back(x);
  q.push_back(to);
  printf("%d", q.size());
  travel(q, 1);
  puts("");
  q.clear();
  q.push_back(s);
  for (x = v; x != t; x = cyc[x]) q.push_back(x);
  q.push_back(t);
  p.clear();
  for (x = to; x != t; x = pre[x]) p.push_back(x);
  printf("%d", q.size() + p.size());
  travel(q, 1);
  travel(p, -1);
  puts("");
  q.clear();
  for (x = s; x != y; x = cyc[x]) q.push_back(x);
  q.push_back(y);
  p.clear();
  for (x = to; x != y; x = pre[x]) p.push_back(x);
  printf("%d", q.size() + p.size());
  travel(q, 1);
  travel(p, -1);
  puts("");
  exit(0);
}
void dfs(int x, int fr) {
  int p, y, u, v;
  for (p = e(x); p; p = e[p].nxt)
    if ((y = e[p].y) != fr) {
      if (!dep[y]) {
        dep[y] = dep[x] + 1;
        pre[y] = x;
        dfs(y, x);
      } else if (dep[y] < dep[x]) {
        for (u = x, v = y; u != y; v = u, u = pre[u]) {
          if (cyc[u])
            solve(u, v, y);
          else
            cyc[u] = v;
        }
      }
    }
}
void BCC() {
  for (int i = 1; i <= n; i++)
    if (!dep[i]) dep[i] = 1, pre[1] = 0, dfs(i, 0);
  puts("NO");
}
void link(int x, int y) { e.push2(x, y); }
}  // namespace G
int main() {
  int i;
  n = ri(), m = ri();
  for (i = 1; i <= m; i++) G::link(ri(), ri());
  G::BCC();
  return 0;
}
