#include <bits/stdc++.h>
using namespace std;
void FastIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(20);
}
long long max(long long a, long long b) {
  if (a > b)
    return a;
  else
    return b;
}
long long min(long long a, long long b) {
  if (a < b)
    return a;
  else
    return b;
}
long long pow(long long B, long long P) {
  long long S = 1;
  for (long long i = 1; i <= P; i++) S = S * B;
  return S;
}
int fx4[] = {1, -1, 0, 0};
int fy4[] = {0, 0, 1, -1};
vector<int> graph[200000];
vector<int> first, second;
int color[200000];
bool BFS(int source) {
  color[source] = 2;
  queue<int> Q;
  Q.push(source);
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    for (int i = 0; i < graph[u].size(); i++) {
      int v = graph[u][i];
      if (color[v] == 0 && color[u] == 2) {
        color[v] = 1;
        Q.push(v);
      } else if (color[v] == 0 && color[u] == 1) {
        color[v] = 2;
        Q.push(v);
      } else if (color[v] != 0 && color[u] == color[v]) {
        return false;
      }
    }
  }
  return true;
}
int main() {
  FastIO();
  int N, M;
  cin >> N >> M;
  int u, v;
  int source;
  for (int i = 0; i < M; i++) {
    cin >> u >> v;
    source = u;
    graph[u].push_back(v);
    graph[v].push_back(u);
  }
  for (int i = 1; i <= N; i++) {
    bool check;
    if (color[i] == 0 && graph[i].size() > 0) check = BFS(i);
    if (check == false) {
      cout << "-1" << endl;
      return 0;
    }
  }
  for (int i = 1; i <= N; i++) {
    if (color[i] == 1)
      first.push_back(i);
    else if (color[i] == 2)
      second.push_back(i);
  }
  cout << first.size() << endl;
  for (int i = 0; i < first.size(); i++) cout << first[i] << " ";
  cout << endl;
  cout << second.size() << endl;
  for (int i = 0; i < second.size(); i++) cout << second[i] << " ";
  cout << endl;
  return 0;
}
