#include <bits/stdc++.h>
using namespace std;
int read() {
  int s = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
  return s * w;
}
struct Edge {
  int to, next;
} a[200010 << 1];
int h[200010], cnt = 1, n, m, v[200010], X[200010], Y[200010], d[200010],
               pa[200010];
void add(int x, int y) {
  a[++cnt] = (Edge){y, h[x]}, h[x] = cnt, a[++cnt] = (Edge){x, h[y]},
  h[y] = cnt;
}
int LCA(int x, int y) {
  while (d[x] < d[y]) y = pa[y];
  while (d[x] > d[y]) x = pa[x];
  while (x ^ y) x = pa[x], y = pa[y];
  return x;
}
void print(int x, int y, int z, int w) {
  cout << "YES\n";
  if (d[y] < d[w]) swap(y, w), swap(x, z);
  int lc = LCA(x, z);
  v[0] = 0;
  for (int i = lc; i ^ y; i = pa[i]) v[++v[0]] = i;
  v[++v[0]] = y;
  cout << v[0] << ' ';
  for (int i = v[0]; i; i--) cout << v[i] << ' ';
  cout << '\n';
  v[v[0] = 1] = y;
  for (int i = x; i ^ lc; i = pa[i]) v[++v[0]] = i;
  v[++v[0]] = lc;
  cout << v[0] << ' ';
  for (int i = 1; i <= v[0]; i++) cout << v[i] << ' ';
  cout << '\n';
  v[0] = 0;
  for (int i = y; i ^ w; i = pa[i]) v[++v[0]] = i;
  v[++v[0]] = w;
  for (int i = z; i ^ lc; i = pa[i]) v[++v[0]] = i;
  v[++v[0]] = lc;
  cout << v[0] << ' ';
  for (int i = 1; i <= v[0]; i++) cout << v[i] << ' ';
  cout << '\n';
  exit(0);
}
void Dfs(int x) {
  v[x] = 1, d[x] = d[pa[x]] + 1;
  for (int i = h[x]; i; i = a[i].next)
    if (!v[a[i].to])
      pa[a[i].to] = x, Dfs(a[i].to);
    else if (a[i].to ^ pa[x] && d[a[i].to] < d[x])
      for (int j = x; j ^ a[i].to; j = pa[j])
        if (X[j] && Y[j])
          print(X[j], Y[j], x, a[i].to);
        else
          X[j] = x, Y[j] = a[i].to;
}
signed main() {
  n = read(), m = read();
  for (int i = 1; i <= m; i++) add(read(), read());
  for (int i = 1; i <= n; i++)
    if (!v[i]) Dfs(i);
  cout << "NO\n";
  return 0;
}
