#include <bits/stdc++.h>
using namespace std;
long long zero = 0;
long long one = 1;
int max_int = INT_MAX;
int min_int = INT_MIN;
void printArray(long long a[], long long n) {
  for (long long i = 0; i < n; i++) cout << a[i] << " ";
  cout << endl;
}
void printVector(vector<long long> v) {
  long long n = v.size();
  for (long long i = 0; i < n; i++) cout << v[i] << " ";
  cout << endl;
}
string reversed(string s) {
  string t = "";
  for (long long i = s.length() - 1; i >= 0; i--) t += s[i];
  return t;
}
string binary(long long n, long long val) {
  string s = "";
  while (n > 0) {
    if (n % 2 == 1)
      s = s + '1';
    else
      s = s + '0';
    n = n / 2;
  }
  long long k = val - s.size();
  for (long long i = 0; i < k; i++) s += '0';
  return reversed(s);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  vector<vector<long long> > adj_list(n + 1);
  vector<long long> x(m), y(m);
  for (long long i = 0; i < m; i++) {
    cin >> x[i] >> y[i];
    adj_list[x[i]].push_back(y[i]);
    adj_list[y[i]].push_back(x[i]);
  }
  vector<long long> level(n + 1, 0);
  vector<bool> check(n + 1, false);
  for (long long j = 1; j <= n; j++) {
    if (check[j] == false) {
      level[j] = 0;
      queue<long long> q;
      q.push(j);
      while (q.size() != 0) {
        long long node = q.front();
        check[node] = true;
        q.pop();
        vector<long long> v = adj_list[node];
        for (long long i = 0; i < v.size(); i++) {
          long long x1 = v[i];
          if (check[x1] == false) {
            level[x1] = level[node] + 1;
            q.push(x1);
          }
        }
      }
    }
  }
  bool possible = true;
  for (long long i = 0; i < m; i++) {
    long long l1 = level[x[i]];
    long long l2 = level[y[i]];
    long long diff = abs(l1 - l2);
    if (diff % 2 == 0) {
      possible = false;
      break;
    }
  }
  if (possible == false) {
    cout << -1 << endl;
  } else {
    vector<long long> s1, s2;
    for (long long i = 1; i <= n; i++) {
      if (level[i] % 2 == 0) {
        s1.push_back(i);
      } else if (level[i] % 2 != 0) {
        s2.push_back(i);
      }
    }
    cout << s1.size() << endl;
    printVector(s1);
    cout << s2.size() << endl;
    printVector(s2);
  }
}
