#include <bits/stdc++.h>
using namespace std;
bool comp(long long x, long long y) { return x > y; }
int dx[] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[] = {1, -1, 0, 0, -1, 1, 1, -1};
int main() {
  int v, e;
  scanf("%d %d", &v, &e);
  vector<vector<int> > adj(v);
  for (int i = 0; i < e; i++) {
    int from, to;
    scanf("%d %d", &from, &to);
    from--;
    to--;
    adj[from].push_back(to);
    adj[to].push_back(from);
  }
  bool isBipartite = true;
  vector<int> color(v, 2000000000);
  int start = -1;
  for (int i = 0; i < v; i++) {
    if (color[i] == 2000000000) {
      start = i;
      queue<int> q;
      q.push(start);
      color[start] = 0;
      while (!q.empty() && isBipartite) {
        int u = q.front();
        q.pop();
        for (int i = 0; i < adj[u].size(); i++) {
          int v = adj[u][i];
          if (color[v] == 2000000000) {
            color[v] = 1 - color[u];
            q.push(v);
          } else if (color[v] == color[u]) {
            isBipartite = false;
            break;
          }
        }
      }
    }
  }
  if (isBipartite) {
    int zeros = 0, ones = 0;
    for (int i = 0; i < v; i++) {
      if (color[i] == 0)
        zeros++;
      else if (color[i] == 1)
        ones++;
    }
    printf("%d\n", zeros);
    for (int i = 0; i < v; i++)
      if (color[i] == 0) printf("%d ", i + 1);
    printf("\n");
    printf("%d\n", ones);
    for (int i = 0; i < v; i++)
      if (color[i] == 1) printf("%d ", i + 1);
    printf("\n");
  } else
    cout << -1 << endl;
  return 0;
}
