#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  int f = 0;
  x = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) f |= (ch == '-');
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  if (f) x = -x;
}
const int N = 200005;
int f[N], fa[N], x[N], y[N], res[N];
int n, m, a, b, c, d, F, A, B;
vector<int> e[N], ans;
void dfs(int u) {
  if (F) return;
  for (auto v : e[u]) {
    if (v == fa[u]) continue;
    if (!f[v])
      f[v] = f[u] + 1, fa[v] = u, dfs(v);
    else if (f[v] < f[u]) {
      for (int s = u; s != v; s = fa[s]) {
        if (x[s]) {
          a = x[s], b = y[s], c = u, d = v;
          F = 1;
          return;
        }
        x[s] = u, y[s] = v;
      }
    }
  }
}
map<pair<int, int>, int> R;
int dfs(int u, int k) {
  res[u] = 0;
  if (u == B) return ans.push_back(u), 1;
  for (auto v : e[u])
    if (!R[make_pair(u, v)] && res[v] == k && dfs(v, k))
      return ans.push_back(u), R[make_pair(u, v)] = 1, R[make_pair(v, u)] = 1,
                                              1;
  return 0;
}
void doit(int k) {
  ans.clear(), res[B] = k, dfs(A, k);
  printf("%d", (int)ans.size());
  for (auto x : ans) printf(" %d", x);
  puts("");
}
int main() {
  read(n), read(m);
  for (int i = (1); i <= (m); i++) {
    read(a), read(b);
    e[a].push_back(b), e[b].push_back(a);
  }
  for (int u = (1); u <= (n); u++)
    if (!f[u]) f[u] = 1, dfs(u);
  if (!F) return puts("NO"), 0;
  for (int x = a; f[x] >= f[b]; x = fa[x]) res[x] |= 1;
  for (int x = c; f[x] >= f[d]; x = fa[x]) {
    res[x] |= 2;
    if (res[x] == 3) A = (!A ? x : A), B = x;
  }
  puts("YES");
  int c[4] = {0, 0, 0, 0}, p[4] = {0, 1, 2, 3};
  for (int i = (1); i <= (n); i++) c[res[i]]++;
  c[3] -= 2;
  sort(p + 1, p + 4, [&](int a, int b) { return c[a] < c[b]; });
  for (int k = (1); k <= (3); k++) doit(p[k]);
  return 0;
}
