#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 200007;
void failure() {
  cout << "NO" << lf;
  exit(0);
}
vector<int> e[_];
int n, m, fa[_] = {0}, dfn[_] = {0}, ndf[_] = {0}, dcnt = 0;
int cir[_] = {0}, hasa = 0, hasb = 0;
vector<pair<int, int>> cs;
void dfs(int x, int ff) {
  fa[x] = ff, dfn[x] = ++dcnt;
  for (auto b : e[x]) {
    if (b == ff) continue;
    if (!dfn[b])
      dfs(b, x), cir[x] += cir[b];
    else if (dfn[b] < dfn[x])
      cir[x]++, cir[b]--, cs.emplace_back(b, x);
  }
  if (cir[x] >= 2) hasa = x, hasb = ff;
  ndf[x] = dcnt;
}
int isfa(int ff, int x) { return dfn[ff] <= dfn[x] && dfn[x] <= ndf[ff]; }
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), m = ty();
  for (int i = 1, a, b; i <= m; i++)
    a = ty(), b = ty(), e[a].emplace_back(b), e[b].emplace_back(a);
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) dfs(i, 0);
  if (!hasa) failure();
  cout << "YES" << lf;
  pair<int, int> c1, c2;
  for (auto [a, b] : cs)
    if (isfa(a, hasb) && isfa(hasa, b)) (c1.first ? c2 : c1) = make_pair(a, b);
  if (isfa(c2.first, c1.first)) swap(c1, c2);
  int sta = 0;
  for (int i = 1; i <= n; i++)
    if (isfa(i, c1.second) && isfa(i, c2.second) && dfn[i] > dfn[sta]) sta = i;
  vector<int> temp;
  for (int i = sta; temp.emplace_back(i), i != c2.first; i = fa[i])
    ;
  cout << ((int)((temp).size())), reverse(temp.begin(), temp.end());
  for (auto i : temp) cout << ' ' << i;
  cout << lf, temp.clear();
  for (int i = c2.first; temp.emplace_back(i), i != c1.first; i = fa[i])
    ;
  for (int i = c1.second; temp.emplace_back(i), i != sta; i = fa[i])
    ;
  cout << ((int)((temp).size()));
  for (auto i : temp) cout << ' ' << i;
  cout << lf, temp.clear();
  temp.emplace_back(c2.first);
  for (int i = c2.second; temp.emplace_back(i), i != sta; i = fa[i])
    ;
  cout << ((int)((temp).size()));
  for (auto i : temp) cout << ' ' << i;
  cout << lf, temp.clear();
  return 0;
}
