#include <bits/stdc++.h>
using namespace std;
vector<int> set1;
vector<int> set2;
int col[100004], vis[100004];
int flag = 1;
class Graph {
  int V;
  list<int> *adj;

 public:
  Graph(int V);
  void addEdge(int v, int w);
  void BFS(int s);
};
Graph::Graph(int V) {
  this->V = V;
  adj = new list<int>[V];
}
void Graph::addEdge(int v, int w) {
  adj[v].push_back(w);
  adj[w].push_back(v);
}
void Graph::BFS(int s) {
  list<int> queue;
  vis[s] = 1;
  queue.push_back(s);
  col[s] = 0;
  list<int>::iterator i;
  while (!queue.empty()) {
    s = queue.front();
    queue.pop_front();
    if (col[s] == 0) {
      set1.push_back(s);
    } else {
      set2.push_back(s);
    }
    for (i = adj[s].begin(); i != adj[s].end(); ++i) {
      if (vis[*i] != 1) {
        vis[*i] = 1;
        queue.push_back(*i);
        col[*i] = (col[s] + 1) % 2;
      } else {
        if ((col[s] + 1) % 2 != col[*i]) {
          flag = 0;
          return;
        }
      }
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  Graph g(n);
  memset(col, -1, sizeof(col));
  memset(vis, -1, sizeof(vis));
  int a, b;
  while (m--) {
    cin >> a >> b;
    vis[a - 1] = 0;
    vis[b - 1] = 0;
    g.addEdge(a - 1, b - 1);
  }
  for (int i = 0; i < n; i++) {
    if (vis[i] == 0) g.BFS(i);
    if (flag == 0) break;
  }
  if (flag == 0) {
    cout << "-1\n";
  } else {
    cout << set1.size() << "\n";
    for (vector<int>::iterator i = set1.begin(); i != set1.end(); ++i)
      cout << (*i) + 1 << ' ';
    cout << '\n';
    cout << set2.size() << "\n";
    for (vector<int>::iterator i = set2.begin(); i != set2.end(); ++i)
      cout << (*i) + 1 << ' ';
  }
  return 0;
}
