#include <bits/stdc++.h>
using namespace std;
const int Maxn = 200005;
vector<int> e[Maxn];
vector<pair<int, int>> g;
int dep[Maxn], tag[Maxn], prt[Maxn];
void dfs(int x, int fa) {
  dep[x] = dep[prt[x] = fa] + 1;
  for (int y : e[x]) {
    if (y == fa) continue;
    if (dep[y]) {
      if (dep[y] < dep[x]) {
        tag[x]++;
        tag[y]--;
      }
    } else {
      dfs(y, x);
      tag[x] += tag[y];
    }
  }
}
void dfs2(int x) {
  for (int y : e[x]) {
    if (y == prt[x]) continue;
    if (dep[y] < dep[x]) {
      g.emplace_back(x, y);
      continue;
    }
    if (dep[y] == dep[x] + 1) dfs2(y);
  }
}
int lca(int x, int y) {
  while (x != y) {
    if (dep[x] < dep[y]) swap(x, y);
    x = prt[x];
  }
  return x;
}
bool dfs3(int x, int t, int flag, vector<int>& path) {
  if (!x) throw;
  if (x == t) {
    path.push_back(x);
    return true;
  }
  if (flag == 1) {
    for (int y : e[x]) {
      if (dep[y] != dep[x] + 1) continue;
      if (dfs3(y, t, flag, path)) {
        path.push_back(x);
        return true;
      }
    }
  } else if (dfs3(prt[x], t, flag, path)) {
    path.push_back(x);
    return true;
  }
  return false;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[x].push_back(y);
    e[y].push_back(x);
  }
  for (int i = 1; i <= n; i++)
    if (!dep[i]) dfs(i, 0);
  for (int rt = 1; rt <= n; rt++)
    if (tag[rt] > 1) {
      dfs2(rt);
      sort(g.begin(), g.end(), [](pair<int, int> a, pair<int, int> b) {
        return dep[a.second] < dep[b.second];
      });
      if (g.size() <= 1) exit(0);
      int s = lca(g[0].first, g[1].first);
      int t = g[dep[g[0].second] < dep[g[1].second]].second;
      vector<int> path1, path2, path3, path4, path5;
      dfs3(s, t, -1, path1);
      dfs3(s, g[0].first, 1, path2);
      dfs3(g[0].second, t, 1, path4);
      dfs3(s, g[1].first, 1, path3);
      dfs3(g[1].second, t, 1, path5);
      path2.insert(path2.begin(), path4.begin(), path4.end());
      path3.insert(path3.begin(), path5.begin(), path5.end());
      auto print = [](vector<int> a) {
        cout << a.size() << " ";
        for (int i : a) cout << i << " ";
        cout << "\n";
      };
      puts("YES");
      print(path1);
      print(path2);
      print(path3);
      return 0;
    }
  puts("NO");
  return 0;
}
