#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
int color[100001];
int n, m;
vector<int> v[100001];
bool visited[100001];
bool check_bipartite(int s) {
  color[s] = 1;
  queue<int> q;
  visited[s] = true;
  q.push(s);
  while (!q.empty()) {
    s = q.front();
    q.pop();
    for (__typeof(v[s].begin()) it = v[s].begin(); it != v[s].end(); it++) {
      if (color[*it] == -1) {
        color[*it] = 1 - color[s];
        q.push(*it);
        visited[*it] = true;
      } else if (color[s] == color[*it])
        return false;
    }
  }
  return true;
}
void scan() {
  for (int i = (1); i <= (n); i++) v[i].clear();
  int v1, v2;
  for (int i = (0); i <= (m - 1); i++) {
    cin >> v1 >> v2;
    v[v1].push_back(v2);
    v[v2].push_back(v1);
  }
}
int main() {
  cin >> n >> m;
  scan();
  for (int i = (1); i <= (n); i++) color[i] = -1;
  for (int i = (1); i <= (n); i++) {
    if (visited[i] == false) {
      bool ret = check_bipartite(i);
      if (ret == false) {
        cout << -1 << endl;
        return 0;
      }
    }
  }
  vector<int> tmp, tmp2;
  tmp.clear();
  tmp2.clear();
  for (int i = (1); i <= (n); i++)
    if (color[i] == 1)
      tmp.push_back(i);
    else
      tmp2.push_back(i);
  cout << (int)(tmp.size()) << endl;
  for (__typeof(tmp.begin()) it = tmp.begin(); it != tmp.end(); it++)
    cout << *it << " ";
  cout << endl;
  cout << (int)(tmp2.size()) << endl;
  for (__typeof(tmp2.begin()) it = tmp2.begin(); it != tmp2.end(); it++)
    cout << *it << " ";
  cout << endl;
  return 0;
}
