#include <bits/stdc++.h>
using namespace std;
int read() {
  char ch;
  for (ch = getchar(); ch < '0' || ch > '9'; ch = getchar())
    ;
  int x = ch - '0';
  for (ch = getchar(); ch >= '0' && ch <= '9'; ch = getchar())
    x = x * 10 + ch - '0';
  return x;
}
const int N = 2e5 + 5;
int t[N << 1], nxt[N << 1], lst[N], l;
void add(int x, int y) {
  t[++l] = y;
  nxt[l] = lst[x];
  lst[x] = l;
}
int n, m, cnt[N], id[N], fa[N], p1, p2, S, T;
bool vis[N], in_sta[N];
set<int> in[N], out[N];
vector<pair<int, int> > e;
vector<int> a, b, an_0, an_1, an_2;
void write(vector<int> a) {
  printf("%d ", a.size());
  for (int x : a) printf("%d ", x);
  puts("");
}
void dfs(int x, int y) {
  vis[x] = in_sta[x] = 1;
  for (int i = lst[x]; i; i = nxt[i]) {
    if (i == y) continue;
    if (!vis[t[i]]) {
      fa[t[i]] = x;
      dfs(t[i], i ^ 1);
    } else if (in_sta[t[i]])
      e.push_back(make_pair(x, t[i]));
  }
  in_sta[x] = 0;
}
void calc(int x) {
  if (p1) return;
  vis[x] = 1;
  for (int i = lst[x]; i; i = nxt[i])
    if (!vis[t[i]]) {
      calc(t[i]);
      if (id[t[i]] && !out[x].count(id[t[i]])) {
        if (id[x]) {
          p1 = id[x];
          p2 = id[t[i]];
          break;
        }
        id[x] = id[t[i]];
      }
    }
  for (int d : in[x]) {
    if (id[x]) {
      p1 = id[x];
      p2 = d;
      break;
    }
    id[x] = d;
  }
}
int main() {
  n = read();
  m = read();
  l = 1;
  for (int i = 1; i <= m; i++) {
    int x = read(), y = read();
    add(x, y);
    add(y, x);
  }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) dfs(i, 0);
  for (int i = 0; i < e.size(); i++) {
    pair<int, int> tmp = e[i];
    in[tmp.first].insert(i + 1);
    out[tmp.second].insert(i + 1);
  }
  for (int i = 1; i <= n; i++) vis[i] = 0;
  for (int i = 1; i <= n; i++)
    if (!vis[i]) calc(i);
  if (!p1) {
    puts("NO");
    return 0;
  }
  puts("YES");
  for (int x = e[p1 - 1].first; x != fa[e[p1 - 1].second]; x = fa[x])
    a.push_back(x);
  for (int x = e[p2 - 1].first; x != fa[e[p2 - 1].second]; x = fa[x])
    b.push_back(x);
  for (int x : a) cnt[x]++;
  for (int x : b) cnt[x]++;
  S = T = -1;
  for (int i = 0; i <= a.size() - 1; i++)
    if (cnt[a[i]] == 2) {
      an_0.push_back(a[i]);
      if (S == -1) S = i;
      T = i;
    }
  for (int i = S; i >= 0; i--) an_1.push_back(a[i]);
  for (int i = a.size() - 1; i >= T; i--) an_1.push_back(a[i]);
  S = T = -1;
  for (int i = 0; i <= b.size() - 1; i++)
    if (cnt[b[i]] == 2) {
      if (S == -1) S = i;
      T = i;
    }
  for (int i = S; i >= 0; i--) an_2.push_back(b[i]);
  for (int i = b.size() - 1; i >= T; i--) an_2.push_back(b[i]);
  write(an_0);
  write(an_1);
  write(an_2);
  return 0;
}
