#include <bits/stdc++.h>
using namespace std;
int n, m, top, tot, cnt;
int fir[202020], nxt[202020 << 1], to[202020 << 1];
int dfn[202020], fa[202020], st[202020];
struct evol {
  int v, nm;
} l1[202020], l2[202020];
void add(int x, int y) {
  nxt[++cnt] = fir[x];
  fir[x] = cnt;
  to[cnt] = y;
}
void dfs(int x) {
  dfn[x] = ++tot;
  l1[x] = l2[x] = (evol){tot, x};
  for (int i = fir[x]; i; i = nxt[i])
    if (to[i] != fa[x]) {
      if (!dfn[to[i]]) {
        fa[to[i]] = x;
        dfs(to[i]);
        if (l1[to[i]].v < l1[x].v) {
          if (l2[to[i]].v < l1[x].v)
            l1[x] = l1[to[i]], l2[x] = l2[to[i]];
          else
            l2[x] = l1[x], l1[x] = l1[to[i]];
        } else if (l1[to[i]].v < l2[x].v)
          l2[x] = l1[to[i]];
      } else if (dfn[to[i]] < l1[x].v)
        l2[x] = l1[x], l1[x] = (evol){dfn[to[i]], x};
      else if (dfn[to[i]] < l2[x].v)
        l2[x] = (evol){dfn[to[i]], x};
    }
  if (l2[x].v < dfn[x]) {
    puts("YES");
    int ed = l2[x].v;
    top = 0;
    for (int i = x;; i = fa[i]) {
      st[++top] = i;
      if (dfn[i] == ed) {
        ed = i;
        break;
      }
    }
    printf("%d ", top);
    for (int i = 1; i <= top; i++) printf("%d ", st[i]);
    puts("");
    st[top = 1] = ed;
    for (int i = l2[x].nm; st[top] != x; i = fa[i]) st[++top] = i;
    printf("%d ", top);
    while (top) printf("%d ", st[top--]);
    puts("");
    dfn[0] = tot + 1;
    for (int i = ed; dfn[st[top]] > l1[x].v; i = fa[i]) st[++top] = i;
    for (int i = l1[x].nm; st[top] != x; i = fa[i]) st[++top] = i;
    printf("%d ", top);
    while (top) printf("%d ", st[top--]);
    puts("");
    exit(0);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) dfs(i);
  puts("NO");
  return 0;
}
