#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int dep[N], fa[N], f[N];
int n, m, l1, l2, r1, r2, s, t, x, y;
vector<int> e[N];
void dfs(int x, int father) {
  dep[x] = dep[father] + 1;
  fa[x] = father;
  for (int i = 0; i < e[x].size(); i++) {
    if (!dep[e[x][i]])
      dfs(e[x][i], x);
    else if (dep[e[x][i]] < dep[x] && e[x][i] != father) {
      --f[e[x][i]], ++f[x];
    }
  }
  f[father] += f[x];
}
void DFS(int x) {
  for (int i = 0; i < e[x].size(); i++)
    if (dep[e[x][i]] == dep[x] + 1) {
      DFS(e[x][i]);
      if (l2) return;
    } else if (dep[e[x][i]] < dep[s] && e[x][i] != fa[x]) {
      if (l1)
        r2 = x, l2 = e[x][i];
      else
        r1 = x, l1 = e[x][i];
      if (l2) return;
    }
}
int d[N];
void go(int l, int r) {
  int k = t;
  t += abs(dep[r] - dep[l]) + 1;
  if (dep[l] > dep[r])
    for (int i = l, j = k + 1; j <= t; i = fa[i], ++j) d[j] = i;
  else
    for (int i = r, j = t; j > k; i = fa[i], --j) d[j] = i;
}
void print() {
  printf("%d ", t);
  for (int i = 1; i <= t; ++i) printf("%d ", d[i]);
  puts("");
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    e[a].push_back(b);
    e[b].push_back(a);
  }
  for (int i = 1; i <= n; ++i)
    if (!dep[i]) dfs(i, 0);
  for (int i = 1; i <= n; ++i)
    if (f[i] > 1) {
      s = i;
      break;
    }
  if (!s) {
    puts("NO");
    return 0;
  }
  DFS(s);
  clog << l1 << ' ' << r1 << ' ' << l2 << ' ' << r2 << endl;
  puts("YES");
  if (dep[l1] > dep[l2]) swap(l1, l2), swap(r1, r2);
  for (x = r1, y = r2; x != y;) dep[x] > dep[y] ? x = fa[x] : y = fa[y];
  t = 0;
  go(x, r1);
  go(l1, l2);
  print();
  t = 0;
  go(x, r2);
  go(l2, l2);
  print();
  t = 0;
  go(x, l2);
  print();
  return 0;
}
