#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, h[N], w[N], fa[N];
vector<int> g[N];
bool vis[N];
vector<int> ans;
void out() {
  cout << (int)ans.size();
  for (auto v : ans) cout << " " << v;
  cout << "\n";
  ans.clear();
}
vector<int> nxt[N], pre[N];
vector<pair<int, int> > pos;
bool can[N];
int lca(int u, int v) {
  if (h[u] < h[v]) swap(u, v);
  while (h[u] > h[v]) u = fa[u];
  while (u != v) {
    u = fa[u], v = fa[v];
  }
  return u;
}
void go(int s, int x, int y, int t) {
  while (t != fa[y]) {
    ans.push_back(t), t = fa[t];
  }
  while (x != fa[s]) {
    ans.push_back(x), x = fa[x];
  }
  reverse(ans.begin(), ans.end());
}
void dfs1(int u, int mn) {
  if ((int)pos.size() > 1) return;
  for (auto it : pre[u]) {
    if (h[it] < mn) pos.push_back(pair<int, int>(u, it));
  }
  for (auto v : g[u]) {
    if (h[v] < h[u]) continue;
    dfs1(v, mn);
  }
}
void dfs(int u) {
  vis[u] = true;
  for (auto v : g[u]) {
    if (vis[v]) {
      if (h[u] - h[v] > 1) {
        w[u]++, w[v]--;
        nxt[v].push_back(u);
        pre[u].push_back(v);
      }
      continue;
    }
    fa[v] = u;
    h[v] = h[u] + 1;
    dfs(v);
    w[u] += w[v];
  }
  if (w[u] >= 2) {
    cout << "YES\n";
    int tmp = fa[u], s, t;
    dfs1(u, h[u]);
    s = lca(pos[0].first, pos[1].first);
    int x1, y1, x2, y2;
    x1 = pos[0].first, y1 = pos[0].second, x2 = pos[1].first,
    y2 = pos[1].second;
    if (h[y1] < h[y2])
      t = y2;
    else
      t = y1;
    tmp = s;
    while (tmp != fa[t] && (int)ans.size() <= n) {
      ans.push_back(tmp), tmp = fa[tmp];
    }
    if ((int)ans.size() > n) {
      cout << "s"
           << "=" << s << " ",
          cout << "t"
               << "=" << t << " ",
          cout << "x1"
               << "=" << x1 << " ",
          cout << "y1"
               << "=" << y1 << " ",
          cout << "x2"
               << "=" << x2 << " ",
          cout << "y2"
               << "=" << y2 << "\n";
      cout << "h[s]"
           << "=" << h[s] << " ",
          cout << "h[t]"
               << "=" << h[t] << "\n";
      cout << "h[x1]"
           << "=" << h[x1] << " ",
          cout << "h[x2]"
               << "=" << h[x2] << " ";
      cout << "h[y1]"
           << "=" << h[y1] << " ",
          cout << "h[y2]"
               << "=" << h[y2] << "\n";
      exit(0);
    }
    out();
    go(s, x1, y1, t);
    out();
    go(s, x2, y2, t);
    out();
    exit(0);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  int u, v;
  for (int i = (1); i < (m + 1); i++) {
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = (1); i < (n + 1); i++)
    if (!vis[i]) dfs(i);
  cout << "NO\n";
  return 0;
}
