#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m, a, b;
  cin >> n >> m;
  list<int> graph[n + 1];
  int i;
  for (i = 0; i < m; i++) {
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  list<int> q;
  int visited[n + 1];
  int set1[n + 1], set2[n + 1];
  for (i = 0; i <= n; i++) {
    visited[i] = 0;
    set1[i] = 0;
    set2[i] = 0;
  }
  list<int>::iterator it;
  int count = 1, sum;
  int level = 0;
  int f = 0;
  int len1 = 0, len2 = 0;
  for (i = 1; i <= n; i++) {
    if (visited[i]) continue;
    visited[i] = 1;
    q.push_back(i);
    level = 0;
    count = 1;
    while (!q.empty()) {
      sum = 0;
      while (count) {
        count--;
        a = q.front();
        q.pop_front();
        if (level == 0) {
          set1[a] = 1;
          len1++;
        } else {
          set2[a] = 1;
          len2++;
        }
        for (it = graph[a].begin(); it != graph[a].end(); ++it) {
          if (!visited[*it]) {
            visited[*it] = 1;
            sum++;
            q.push_back(*it);
          } else {
            if (level == 0 && set1[*it] == 1)
              f = 1;
            else if (level == 1 && set2[*it] == 1)
              f = 1;
          }
        }
      }
      level++;
      count = sum;
      level = level % 2;
    }
  }
  if (f == 1) {
    cout << -1 << endl;
    return 0;
  }
  cout << len1 << endl;
  for (i = 1; i <= n; i++) {
    if (set1[i]) cout << i << " ";
  }
  cout << endl;
  cout << len2 << endl;
  for (i = 1; i <= n; i++) {
    if (set2[i]) cout << i << " ";
  }
}
