#include <bits/stdc++.h>
using namespace std;
int const N = 2e5 + 20;
int n, m, x[N], y[N], d1 = -1, d2 = -1, cnt, ep[N], mark[N], h[N], a;
bool f, vis[N];
vector<int> adj[N], vec[N];
void dfs(int v, int par = -1) {
  vis[v] = 1;
  for (auto ed : adj[v]) {
    if (f) break;
    int u = x[ed] + y[ed] - v;
    if (!vis[u]) {
      ep[u] = ed;
      h[u] = h[v] + 1;
      dfs(u, v);
    }
    if (h[u] < h[v] - 1) {
      int tmp = v;
      while (tmp != u) {
        vec[cnt].push_back(tmp);
        if (mark[ep[tmp]]) {
          f = 1;
          d1 = mark[ep[tmp]] - 1;
          d2 = cnt;
          a = tmp;
        }
        mark[ep[tmp]] = cnt + 1;
        tmp = x[ep[tmp]] + y[ep[tmp]] - tmp;
      }
      vec[cnt++].push_back(u);
    }
  }
}
void print() {
  int st1, en1, st2, en2;
  for (int i = 0; i < vec[d1].size(); i++)
    if (vec[d1][i] == a) st1 = en1 = i;
  for (int i = 0; i < vec[d2].size(); i++)
    if (vec[d2][i] == a) st2 = en2 = i;
  while (st1 > 0 && st2 > 0 && vec[d1][st1 - 1] == vec[d2][st2 - 1])
    st1--, st2--;
  while (en1 < vec[d1].size() - 1 && en2 < vec[d2].size() - 1 &&
         vec[d1][en1 + 1] == vec[d2][en2 + 1])
    en1++, en2++;
  cout << "YES\n";
  cout << en1 - st1 + 1 << ' ';
  for (int i = st1; i <= en1; i++) cout << vec[d1][i] + 1 << ' ';
  cout << '\n';
  cout << vec[d1].size() - en1 + st1 + 1 << ' ';
  for (int i = st1; i >= 0; i--) cout << vec[d1][i] + 1 << ' ';
  for (int i = vec[d1].size() - 1; i >= en1; i--) cout << vec[d1][i] + 1 << ' ';
  cout << '\n';
  cout << vec[d2].size() - en2 + st2 + 1 << ' ';
  for (int i = st2; i >= 0; i--) cout << vec[d2][i] + 1 << ' ';
  for (int i = vec[d2].size() - 1; i >= en2; i--) cout << vec[d2][i] + 1 << ' ';
  cout << '\n';
  return;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> x[i] >> y[i];
    x[i]--, y[i]--;
    adj[x[i]].push_back(i);
    adj[y[i]].push_back(i);
  }
  for (int i = 0; i < n; i++) {
    if (!vis[i] && !f) {
      ep[i] = -1;
      dfs(i);
    }
  }
  if (!~d1) return cout << "NO\n", 0;
  print();
}
