#include <bits/stdc++.h>
using namespace std;
const int M = 1000000007;
const int MM = 998244353;
const long double PI = acos(-1);
long long power(long long b, long long e, long long m) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b % m, e / 2, m) % m;
  return power(b * b % m, e / 2, m);
}
long long power(long long b, long long e) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b, e / 2);
  return power(b * b, e / 2);
}
template <typename T, typename U>
static inline void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
static inline void amax(T &x, U y) {
  if (x < y) x = y;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  return os << '(' << p.first << "," << p.second << ')';
}
int n, m;
const int N = 100005;
vector<int> v[N];
int c[N];
int _runtimeTerror_() {
  cin >> n >> m;
  while (m--) {
    int x, y;
    cin >> x >> y;
    v[x].push_back(y), v[y].push_back(x);
  }
  vector<bool> vis(n + 1, 0);
  for (int i = 1; i <= n; ++i) {
    if (vis[i]) continue;
    queue<int> q;
    c[i] = 0;
    q.push(i);
    vis[i] = true;
    while (!q.empty()) {
      int t = q.front();
      q.pop();
      for (auto k : v[t]) {
        if (!vis[k]) {
          vis[k] = true, q.push(k), c[k] = c[t] ^ 1;
        } else if (vis[k] && c[k] == c[t]) {
          cout << "-1\n";
          return 0;
        }
      }
    }
  }
  vector<int> cc, ccc;
  for (int i = 1; i <= n; ++i) c[i] ? cc.push_back(i) : ccc.push_back(i);
  auto disp = [&](vector<int> a) {
    cout << (long long)a.size() << '\n';
    for (auto j : a) cout << j << " ";
    cout << '\n';
  };
  disp(cc);
  disp(ccc);
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int TESTS = 1;
  while (TESTS--) _runtimeTerror_();
  return 0;
}
