#include <bits/stdc++.h>
using namespace std;
string convertTostr(unsigned long long x) {
  stringstream ss;
  ss << x;
  string st;
  st = ss.str();
  return st;
}
unsigned long long convertToint(string y) {
  unsigned long long num;
  stringstream ss(y);
  ss >> num;
  return num;
}
unsigned long long fpow(unsigned long long b, unsigned long long p,
                        unsigned long long m) {
  if (p == 0) return 1;
  if (p == 1) return b % m;
  unsigned long long res = fpow(b, p / 2, m) % m;
  res = (res * res) % m;
  if (p % 2 != 0) res = (res * (b % m)) % m;
  return res;
}
int gcd(int a, int b) {
  if (a % b == 0) {
    return b;
  } else {
    return gcd(b, a % b);
  }
}
int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  int n, m;
  bool visited[100005];
  int color[100005];
  cin >> n >> m;
  int u, v;
  vector<vector<int> > g(n + 1);
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  memset(visited, 0, sizeof visited);
  memset(color, -1, sizeof color);
  for (int j = 1; j <= n; j++) {
    if (color[j] == -1 && !g[j].empty()) {
      u = j;
      queue<int> check;
      check.push(u);
      color[u] = 1;
      while (!check.empty()) {
        u = check.front();
        check.pop();
        for (int i = 0; i < g[u].size(); i++) {
          v = g[u][i];
          if (color[v] == -1) {
            color[v] = 1 - color[u];
            check.push(v);
          } else if (u != v && color[v] == color[u]) {
            cout << -1;
            return 0;
          }
        }
      }
    }
  }
  vector<int> vc1, vc2;
  for (int i = 1; i <= n; i++) {
    if (color[i] == 1)
      vc1.push_back(i);
    else if (color[i] == 0)
      vc2.push_back(i);
  }
  cout << vc1.size() << endl;
  for (int i = 0; i < vc1.size(); i++) cout << vc1[i] << " ";
  cout << endl << vc2.size() << endl;
  for (int i = 0; i < vc2.size(); i++) cout << vc2[i] << " ";
  return 0;
}
