#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const long long int base = 313;
const long long int inf = 1e8;
const long long int mod = 1e9 + 7;
const int lg = 20;
vector<int> adj[N], ans, tmp;
bool mark[N];
int ed[N], par[N], h[N];
vector<pair<int, int>> be;
void dfs(int u) {
  mark[u] = true;
  for (auto x : adj[u]) {
    bool fl = false;
    if (!mark[x]) {
      h[x] = h[u] + 1;
      par[x] = u;
      dfs(x);
    } else if (x != par[u] && h[x] < h[u]) {
      be.push_back({u, x});
    }
  }
}
int st, fi;
void path(int x, int y) {
  int p;
  ans.clear();
  tmp.clear();
  while (x != st) {
    ans.push_back(x);
    x = par[x];
  }
  ans.push_back(st);
  reverse(ans.begin(), ans.end());
  ans.push_back(y);
  p = fi;
  while (p != y) {
    tmp.push_back(p);
    p = par[p];
  }
  reverse(tmp.begin(), tmp.end());
  for (auto it : tmp) ans.push_back(it);
  cout << ans.size() << ' ';
  for (auto it : ans) cout << it + 1 << ' ';
  cout << endl;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  for (int i = 0; i < n; i++) {
    if (!mark[i]) {
      par[i] = i;
      dfs(i);
    }
    ed[i] = -1;
  }
  for (int i = 0; i < be.size(); i++) {
    int u = be[i].first, v = be[i].second;
    int p = u;
    while (p != v) {
      if (ed[p] == -1) {
        ed[p] = i;
        p = par[p];
        continue;
      }
      cout << "YES" << endl;
      int j = ed[p], x = be[j].first, y = be[j].second;
      st = p;
      fi = p;
      while (ed[fi] == j && fi != v) {
        ans.push_back(fi);
        fi = par[fi];
      }
      ans.push_back(fi);
      cout << ans.size() << ' ';
      for (auto it : ans) cout << it + 1 << ' ';
      cout << endl;
      path(x, y);
      path(u, v);
      return 0;
    }
  }
  cout << "NO" << endl;
  return 0;
}
