#include <bits/stdc++.h>   using namespace std;   vector<int> set1;   vector<int> set2;   int col[100004], vis[100004];   int flag = 1;   class Graph {     int V;     list<int> *adj;       public:     Graph(int V);     void addEdge(int v, int w);     void BFS(int s);   };   Graph::Graph(int V) {     this->V = V;     adj = new list<int>[V];   }   void Graph::addEdge(int v, int w) {     adj[v].push_back(w);     adj[w].push_back(v);   }   void Graph::BFS(int s) {     list<int> queue;     vis[s] = 1;     queue.push_back(s);     col[s] = 0;     list<int>::iterator i;     while (!queue.empty()) {       s = queue.front();       queue.pop_front();       if (col[s] == 0) {         set1.push_back(s);       } else {         set2.push_back(s);       }       for (i = adj[s].begin(); i != adj[s].end(); ++i) {         if (vis[*i] != 1) {           vis[*i] = 1;           queue.push_back(*i);           col[*i] = (col[s] + 1) % 2;         } else {           if ((col[s] + 1) % 2 != col[*i]) {             flag = 0;             return;           }         }       }     }   }   int main() {     int n, m;     cin >> n >> m;     Graph g(n);     memset(col, -1, sizeof(col));     memset(vis, -1, sizeof(vis));     int a, b;     while (m--) {       cin >> a >> b;       vis[a - 1] = 0;       vis[b - 1] = 0;       g.addEdge(a - 1, b - 1);     }     for (int i = 0; i < n; i++) {       if (vis[i] == 0) g.BFS(i);       if (flag == 0) break;     }     if (flag == 0) {       cout <<  -1 n ;     } else {       cout << set1.size() <<   n ;       for (vector<int>::iterator i = set1.begin(); i != set1.end(); ++i)         cout << (*i) + 1 <<    ;       cout <<   n ;       cout << set2.size() <<   n ;       for (vector<int>::iterator i = set2.begin(); i != set2.end(); ++i)         cout << (*i) + 1 <<    ;     }     return 0;   }   