#include <bits/stdc++.h>
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const int inf = 1e9;
const long long INF = 1e18;
const long long mod = 1e9 + 7;
clock_t time_p = clock();
void ktj() {
  time_p = clock() - time_p;
  cerr << "Time elapsed : " << (float)(time_p) / CLOCKS_PER_SEC << "\n";
}
const int N = 1e5 + 5;
vector<int> g[N];
bool vis[N], cis[N];
vector<int> a[2];
int col[N];
bool isBipartite(int u) {
  col[u] = 1;
  queue<int> q;
  q.push(u);
  bool ans = 1;
  while (!q.empty()) {
    int p = q.front();
    cis[p] = 1;
    q.pop();
    for (auto v : g[p]) {
      if (col[v] == -1) {
        col[v] = 1 - col[p];
        q.push(v);
      } else {
        if (col[v] == col[p]) {
          ans = 0;
        }
      }
    }
  }
  return ans;
}
void dfs(int u, int l) {
  if (vis[u]) return;
  vis[u] = 1;
  a[l].push_back(u);
  for (auto c : g[u]) {
    if (!vis[c]) dfs(c, l ^ 1);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  memset(col, -1, sizeof col);
  for (int i = 1; i <= n; i++) {
    if ((int)g[i].size()) {
      if (!cis[i]) {
        if (!isBipartite(i)) {
          cout << -1 << '\n';
          return 0;
        } else {
          dfs(i, 0);
        }
      }
    }
  }
  cout << (int)a[0].size() << '\n';
  for (auto x : a[0]) cout << x << ' ';
  cout << '\n';
  ;
  cout << (int)a[1].size() << '\n';
  for (auto x : a[1]) cout << x << ' ';
  cout << '\n';
  ;
  ktj();
}
