#include <bits/stdc++.h>
using namespace std;
long long power(long long a, long long b) {
  long long res = 1ll;
  while (b > 0) {
    if (b % 2 != 0) res = (res * a) % 1000000007;
    a = (a * a) % 1000000007;
    b /= 2;
  }
  return res % 1000000007;
}
long long ncr(long long n, long long k) {
  if (k > n - k) k = n - k;
  long long pro = 1;
  for (long long i = 0; i < k; i++) {
    pro = (pro * (n - i)) % 1000000007;
    pro /= (i + 1);
  }
  return (pro) % 1000000007;
}
void swap(char *a, char *b) {
  char temp = *a;
  *a = *b;
  *b = temp;
}
vector<vector<long long>> adj;
vector<long long> color;
vector<long long> visited;
bool isBipartite(int v) {
  for (int u : adj[v]) {
    if (!visited[u]) {
      visited[u] = 1;
      color[u] = !color[v];
      if (!isBipartite(u)) return false;
    } else if (color[u] == color[v])
      return false;
  }
  return true;
}
void solve() {
  long long n, m, a, b;
  cin >> n >> m;
  adj.clear();
  adj.resize(n);
  visited.clear();
  visited.resize(n, 0);
  color.clear();
  color.resize(n);
  for (int i = 0; i < m; i++) {
    cin >> a >> b;
    a--;
    b--;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  vector<long long> a1, a2;
  for (int i = 0; i < n; i++) {
    if (!visited[i]) {
      visited[i] = 1;
      color[i] = 0;
      if (!isBipartite(i)) {
        cout << "-1";
        return;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (color[i] == 0)
      a1.push_back(i);
    else
      a2.push_back(i);
  }
  cout << a1.size() << "\n";
  for (auto itr : a1) cout << itr + 1 << " ";
  cout << "\n";
  cout << a2.size() << "\n";
  for (auto itr : a2) cout << itr + 1 << " ";
  cout << "\n";
}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long t;
  t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
