#include <bits/stdc++.h>
using namespace std;
void addmod(int &a, long long b) {
  a = (a + b);
  if (a >= 1000000007) a -= 1000000007;
}
void mulmod(int &a, long long b) { a = (a * b) % 1000000007; }
int gi() {
  int a;
  scanf("%d", &a);
  return a;
}
long long gll() {
  long long a;
  scanf("%I64d", &a);
  return a;
}
class graphal {
 public:
  int n;
  vector<vector<int> > ed;
  vector<int> vs, va, vb;
  bool ok;
  graphal(const int &n) : n(n), ed(n), vs(n, 0), ok(true) {}
  void add(int a, int b) {
    ed[a].push_back(b);
    ed[b].push_back(a);
  }
  void load(int m) {
    for (int i = 0; i < m; i++) {
      int a = gi(), b = gi();
      add(a - 1, b - 1);
    }
  }
  void dfs(int v = 0, int pa = -1, int d = 0) {
    if (vs[v] && vs[v] != d) {
      ok = false;
    }
    if (vs[v]) return;
    vs[v] = d;
    if (d == 1)
      d = 2, va.push_back(v);
    else
      d = 1, vb.push_back(v);
    for (auto i : ed[v])
      if (i != pa) {
        dfs(i, v, d);
      }
  }
};
int main() {
  int n = gi(), m = gi();
  graphal g(n);
  g.load(m);
  for (int i = 0; i < n && g.ok; i++)
    if (g.vs[i] == 0 && g.ed[i].size() > 0) {
      g.dfs(i, -1, 1);
    }
  if (!g.ok) {
    cout << -1 << endl;
    return 0;
  }
  printf("%d\n", (int)g.va.size());
  for (int i = 0; i < g.va.size(); i++) {
    if (i) putchar(' ');
    printf("%d", g.va[i] + 1);
  }
  printf("\n%d\n", (int)g.vb.size());
  for (int i = 0; i < g.vb.size(); i++) {
    if (i) putchar(' ');
    printf("%d", g.vb[i] + 1);
  }
  return 0;
}
