#include <bits/stdc++.h>
using namespace std;
int read() {
  int X = 0, w = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') w = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') X = X * 10 + c - '0', c = getchar();
  return X * w;
}
const int N = 200000 + 10;
int n, m;
vector<int> E[N];
int fa[N], dep[N], vis[N], in[N], cu[N], cv[N];
vector<int> p;
int LCA(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  while (dep[u] > dep[v]) u = fa[u];
  while (u != v) u = fa[u], v = fa[v];
  return u;
}
void addpath(int u, int v) {
  vector<int> r;
  bool flag = dep[u] < dep[v];
  if (flag) swap(u, v);
  for (int t = u; t != v; t = fa[t]) r.emplace_back(t);
  r.emplace_back(v);
  if (flag) reverse(r.begin(), r.end());
  for (int i : r) p.emplace_back(i);
}
void print() {
  p.erase(unique(p.begin(), p.end()), p.end());
  printf("%lu", p.size());
  for (int i : p) printf(" %d", i);
  puts("");
}
void print(int a, int b, int c, int d) {
  if (dep[b] > dep[d]) swap(b, d), swap(a, c);
  int t = LCA(a, c);
  puts("YES");
  p.clear(), addpath(t, d), print();
  p.clear(), addpath(t, a), addpath(b, d), print();
  p.clear(), addpath(t, c), addpath(d, d), print();
  exit(0);
}
void dfs(int u, int f) {
  dep[u] = dep[fa[u] = f] + 1, vis[u] = in[u] = 1;
  for (int v : E[u]) {
    if (v == f) continue;
    if (!vis[v])
      dfs(v, u);
    else if (in[v]) {
      for (int t = u; t != v; t = fa[t]) {
        if (cu[t] && cv[t])
          print(u, v, cu[t], cv[t]);
        else
          cu[t] = u, cv[t] = v;
      }
    }
  }
  in[u] = 0;
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; ++i) {
    int u = read(), v = read();
    E[u].emplace_back(v), E[v].emplace_back(u);
  }
  for (int i = 1; i <= n; ++i)
    if (!vis[i]) dfs(i, 0);
  puts("NO");
  return 0;
}
