#include <bits/stdc++.h>
using namespace std;
void colourNode(vector<int> &A, int colour, int i) {
  if (colour == 1) {
    A[i] = 2;
  } else if (colour == 2) {
    A[i] = 1;
  }
}
bool bfs(vector<int> &colour, vector<vector<int> > &A, vector<bool> &visited,
         int node) {
  if (A[node].empty()) {
    visited[node] = true;
    return true;
  }
  queue<int> q;
  q.push(node);
  colour[node] = 1;
  while (!q.empty()) {
    int f = q.front();
    q.pop();
    visited[f] = true;
    for (int i = 0; i < A[f].size(); i++) {
      if (!visited[A[f][i]]) {
        q.push(A[f][i]);
        if (colour[A[f][i]] == 0) {
          colourNode(colour, colour[f], A[f][i]);
        } else if (colour[A[f][i]] == colour[f]) {
          return false;
        } else {
          continue;
        }
      }
    }
  }
  return true;
}
void Print(vector<int> A, int n) {
  int c = 0;
  for (int i = 1; i < A.size(); i++) {
    if (A[i] == n) {
      c++;
    }
  }
  cout << c << "\n";
  for (int i = 0; i < A.size(); i++) {
    if (A[i] == n) {
      cout << i << " ";
    }
  }
  cout << "\n";
}
int main() {
  int n, e;
  cin >> n >> e;
  vector<vector<int> > A;
  vector<int> temp;
  A.resize(n + 1, temp);
  for (int i = 0; i < e; i++) {
    int a1, a2;
    cin >> a1 >> a2;
    A[a1].push_back(a2);
    A[a2].push_back(a1);
  }
  vector<int> colour(n + 1, 0);
  vector<bool> visited(n + 1, false);
  bool flag = true;
  for (int i = 1; i <= n; i++) {
    if (!visited[i]) {
      if (!bfs(colour, A, visited, i)) {
        flag = false;
        cout << -1 << "\n";
        break;
      }
    }
  }
  if (flag) {
    Print(colour, 1);
    Print(colour, 2);
  }
  return 0;
}
