#include <bits/stdc++.h>
using namespace std;
template <class T>
using priority_queue_min = priority_queue<int, vector<int>, greater<int>>;
struct greater1 {
  bool operator()(const long &a, const long &b) { return a > b; }
};
long long MOD = 1e9 + 7;
long long gcd(long long n1, long long n2) {
  if (n2 == 0) return n1;
  if (n1 % n2 == 0) return n2;
  return gcd(n2, n1 % n2);
}
long long powmod(long long base, long long exponent, long long mod) {
  long long ans = 1;
  while (exponent) {
    if (exponent & 1) ans = (ans * base) % mod;
    base = (base * base) % mod;
    exponent /= 2;
  }
  return ans;
}
void solve_m() {
  int n, k;
  int tmp;
  cin >> n >> k;
  vector<int> vi;
  int t = n;
  while (t--) {
    int tmp;
    cin >> tmp;
    vi.push_back(tmp);
  }
  vector<int> dp(n + 1, 1);
  for (int i = 1; i < vi.size(); i++) {
    if (vi[i] == vi[i - 1])
      dp[i] = 1;
    else
      dp[i] = 1 + dp[i - 1];
  }
  printf("%d\n", *max_element(dp.begin(), dp.end()));
  return;
}
void solve_l() {
  unsigned long long t, n, a, b, k;
  cin >> t >> n >> a >> b >> k;
  if (k > n) {
    printf("0");
    return;
  }
  unsigned long long ans = ((n + 1) / 2) * a + ((n / 2) * b);
  ans = ans / k;
  ans = min(ans, t);
  printf("%lld\n", ans);
  return;
}
void solve_d() {
  vector<vector<int>> graph;
  unordered_map<int, int> mp;
  int n, m;
  cin >> n >> m;
  vector<int> v1(n + 1, 0);
  vector<int> v2(n + 1, 0);
  for (int i = 1; i <= n; i++) {
    v1[i] = i;
    v2[i] = i;
  }
  graph.resize(n + 1);
  int tmp = m;
  while (tmp--) {
    int a, b;
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
    mp[a] += 1;
    mp[b] += 1;
  }
  if (m == 0) {
    for (int i = 1; i <= n; i++) mp[i] = 0;
  }
  unordered_map<int, int>::iterator it;
  bool ans = false;
  for (it = mp.begin(); it != mp.end(); it++) {
    if (it->second < (n - 1)) {
      ans = true;
      break;
    }
  }
  if (ans == false) {
    printf("NO");
    return;
  }
  sort(graph[it->first].begin(), graph[it->first].end());
  int idx = 1;
  if (it->first == idx) idx += 1;
  for (int i = 0; i < graph[it->first].size(); i++) {
    if (it->first == idx) {
      idx += 1;
    }
    if (graph[it->first][i] != idx)
      break;
    else {
      idx += 1;
    }
  }
  if (idx == it->first) idx += 1;
  assert(idx != -1 && idx <= n);
  int i = min(it->first, idx);
  int j = max(it->first, idx);
  v2[i] = v2[j];
  for (int k = j; k > i; k--) {
    v1[k] = v1[k - 1];
  }
  v1[i] = v2[i];
  printf("YES\n");
  for (int i = 1; i <= n; i++) printf("%d ", v1[i]);
  printf("\n");
  for (int i = 1; i <= n; i++) printf("%d ", v2[i]);
  return;
}
int main() { solve_d(); }
