#include <bits/stdc++.h>
const int MAXN = 2e5 + 10;
struct Edge {
  int v, next;
} edge[MAXN << 1];
int head[MAXN], tail = 1, n, m;
void insert(int u, int v) {
  edge[++tail] = (Edge){v, head[u]};
  head[u] = tail;
}
int dfn[MAXN], en[MAXN], clk;
int cnt[MAXN], f[MAXN], dep[MAXN];
int ans = -1;
std::vector<int> out;
void dfs(int u, int fa) {
  dfn[u] = ++clk;
  f[u] = fa;
  dep[u] = dep[fa] + 1;
  for (int i = head[u]; i; i = edge[i].next) {
    int v = edge[i].v;
    if (v == fa) continue;
    if (!dfn[v]) {
      dfs(v, u);
      if (cnt[v] >= 2) {
        ans = i;
      }
      cnt[u] += cnt[v];
    } else {
      if (dfn[v] < dfn[u]) {
        out.push_back(i);
        cnt[u]++;
        cnt[v]--;
      }
    }
  }
  en[u] = clk;
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) std::swap(x, y);
  int k = dep[x] - dep[y];
  for (int i = 1; i <= k; i++) x = f[x];
  while (x != y) {
    x = f[x], y = f[y];
  }
  return x;
}
void solve(int r) {
  int u = edge[ans].v;
  int tot = 0;
  int a1, a2, a3, a4;
  auto in = [=](int x) { return dfn[u] <= dfn[x] && dfn[x] <= en[u]; };
  for (int i : out) {
    int x = edge[i].v, y = edge[i ^ 1].v;
    if (in(x) != in(y)) {
      ++tot;
      if (tot == 1) {
        a1 = x;
        a2 = y;
      } else {
        a3 = x;
        a4 = y;
        break;
      }
    }
  }
  if (dep[a1] > dep[a3]) std::swap(a1, a3), std::swap(a2, a4);
  fprintf(stderr, "%d %d %d %d\n", a1, a2, a3, a4);
  int l = lca(a2, a4);
  std::vector<int> v1, v2, v3;
  for (int x = a3; x != a1; x = f[x]) {
    v1.push_back(x);
  }
  v1.push_back(a1);
  for (int x = a2; x != l; x = f[x]) {
    v1.push_back(x);
  }
  v1.push_back(l);
  v2.push_back(a3);
  for (int x = a4; x != l; x = f[x]) {
    v2.push_back(x);
  }
  v2.push_back(l);
  for (int x = l; x != a3; x = f[x]) {
    v3.push_back(x);
  }
  v3.push_back(a3);
  std::reverse(v3.begin(), v3.end());
  auto print = [](std::vector<int> v) {
    printf("%lu", v.size());
    for (int i : v) {
      printf(" %d", i);
    }
    printf("\n");
  };
  print(v1);
  print(v2);
  print(v3);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    insert(u, v);
    insert(v, u);
  }
  for (int i = 1; i <= n; i++) {
    if (!dfn[i]) {
      out.clear();
      dfs(i, 0);
      if (ans != -1) {
        puts("YES");
        solve(i);
        return 0;
      }
    }
  }
  puts("NO");
}
