#include <bits/stdc++.h>
using namespace std;
int n, m, timer;
int fa[200005], cov[200005], dep[200005], siz[200005], dfn[200005];
int head[200005], nex[200005 << 1], to[200005 << 1], ecnt;
int u[200005], v[200005], inTree[200005];
int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return x;
}
void addE(int u, int v) {
  to[++ecnt] = v;
  nex[ecnt] = head[u], head[u] = ecnt;
}
void dfs(int u) {
  dep[u] = dep[fa[u]] + 1;
  siz[u] = 1, dfn[u] = ++timer;
  for (int i = head[u], v; i; i = nex[i]) {
    v = to[i];
    if (v == fa[u]) continue;
    if (dep[v]) {
      if (dep[v] < dep[u]) {
        ++cov[u];
        --cov[v];
      }
    } else {
      fa[v] = u;
      inTree[i + 1 >> 1] = 1;
      dfs(v);
      cov[u] += cov[v];
      siz[u] += siz[v];
    }
  }
}
inline int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  while (dep[u] > dep[v]) u = fa[u];
  while (u != v) u = fa[u], v = fa[v];
  return u;
}
vector<int> p;
void print() {
  printf("%d", int(p.size()));
  for (int i = 0; i < p.size(); ++i) printf(" %d", p[i]);
  putchar('\n');
}
void solve(int o) {
  int e1(0), e2(0);
  for (int i = 1, u, v; i <= m; ++i) {
    if (inTree[i]) continue;
    u = ::u[i], v = ::v[i];
    if (dep[u] > dep[v]) swap(u, v);
    if (dfn[u] <= dfn[fa[o]] && dfn[fa[o]] <= dfn[u] + siz[u] - 1 &&
        dfn[o] <= dfn[v] && dfn[v] <= dfn[o] + siz[o] - 1) {
      if (e1) {
        e2 = i;
        break;
      } else {
        e1 = i;
      }
    }
  }
  int u1 = ::u[e1], v1 = ::v[e1], u2 = ::u[e2], v2 = ::v[e2];
  if (dep[u1] > dep[v1]) swap(u1, v1);
  if (dep[u2] > dep[v2]) swap(u2, v2);
  if (dep[u1] < dep[u2]) swap(u1, u2), swap(v1, v2);
  int g = lca(v1, v2), cur;
  p.push_back(u1);
  cur = v1;
  while (cur != g) {
    p.push_back(cur);
    cur = fa[cur];
  }
  p.push_back(g);
  print();
  p.clear();
  cur = g;
  while (cur != u1) {
    p.push_back(cur);
    cur = fa[cur];
  }
  p.push_back(u1);
  reverse(p.begin(), p.end());
  print();
  p.clear();
  cur = u1;
  while (cur != u2) {
    p.push_back(cur);
    cur = fa[cur];
  }
  p.push_back(u2);
  cur = v2;
  while (cur != g) {
    p.push_back(cur);
    cur = fa[cur];
  }
  p.push_back(g);
  print();
}
int main() {
  n = read(), m = read();
  for (int i = 1, u, v; i <= m; ++i) {
    ::u[i] = u = read();
    ::v[i] = v = read();
    addE(u, v), addE(v, u);
  }
  for (int i = 1; i <= n; ++i)
    if (!dep[i]) dfs(i);
  for (int i = 1; i <= n; ++i)
    if (cov[i] >= 2) {
      puts("YES");
      solve(i);
      return 0;
    }
  puts("NO");
  return 0;
}
