#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  return b == 0 ? abs(a) : gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
int prime[1000000];
void seive() {
  int n_prime = 1000000;
  fill_n(prime, n_prime, 1);
  prime[0] = 0;
  prime[1] = 0;
  for (int i = 2; i * i <= n_prime; i++) {
    if (prime[i]) {
      for (int j = i * i; j <= n_prime; j += i) {
        prime[j] = 0;
      }
    }
  }
}
void _print(int t) { cerr << t; }
void _print(string t) { cerr << t; }
void _print(char t) { cerr << t; }
void _print(long long t) { cerr << t; }
void _print(double t) { cerr << t; }
template <class T, class V>
void _print(pair<T, V> p);
template <class T>
void _print(vector<T> v);
template <class T>
void _print(set<T> v);
template <class T, class V>
void _print(map<T, V> v);
template <class T>
void _print(multiset<T> v);
template <class T, class V>
void _print(pair<T, V> p) {
  cerr << "{";
  _print(p.ff);
  cerr << ",";
  _print(p.ss);
  cerr << "}";
}
template <class T>
void _print(vector<T> v) {
  cerr << "[ ";
  for (T i : v) {
    _print(i);
    cerr << " ";
  }
  cerr << "]";
}
template <class T>
void _print(set<T> v) {
  cerr << "[ ";
  for (T i : v) {
    _print(i);
    cerr << " ";
  }
  cerr << "]";
}
template <class T>
void _print(multiset<T> v) {
  cerr << "[ ";
  for (T i : v) {
    _print(i);
    cerr << " ";
  }
  cerr << "]";
}
template <class T, class V>
void _print(map<T, V> v) {
  cerr << "[ ";
  for (auto i : v) {
    _print(i);
    cerr << " ";
  }
  cerr << "]";
}
vector<vector<int> > adj;
vector<int> vis;
vector<int> col;
vector<vector<int> > comp;
int ind = 0;
void init(int n) {
  vector<int> temp;
  for (int i = 0; i < n; i++) {
    vis.push_back(0);
    col.push_back(0);
    adj.push_back(temp);
  }
  comp.push_back(temp);
  comp.push_back(temp);
}
void dfs(int s) {
  vis[s] = 1;
  for (auto u : adj[s]) {
    if (vis[u] == 0) {
      vis[u] = 1;
      col[u] = 1 - col[s];
      dfs(u);
    }
    if (col[u] == col[s]) {
      ind = 1;
    }
  }
  comp[col[s]].push_back(s);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  std::cin >> n >> m;
  init(n + 1);
  int x, y;
  for (int i = 0; i < m; i++) {
    std::cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  for (int i = 1; i < n + 1; i++) {
    if (vis[i] == 0) {
      dfs(i);
    }
  }
  if (ind == 0) {
    std::cout << (int)comp[0].size() << '\n';
    for (int i = 0; i < (int)comp[0].size(); i++) {
      cout << comp[0][i] << " ";
    }
    std::cout << '\n';
    std::cout << (int)comp[1].size() << '\n';
    for (int i = 0; i < (int)comp[1].size(); i++) {
      cout << comp[1][i] << " ";
    }
    std::cout << '\n';
  } else {
    std::cout << -1 << '\n';
  }
  return 0;
}
