void addPolygon( const TIntVector& ib ) { ++polygonCount; TIntVector::const_iterator vit, vitEnd = ib.end(); for( vit = ib.begin(); vit != vitEnd; ++vit ) { int idx = *vit; assert( idx >= 0 && idx < vertexUseCount.size() ); vertices.insert( idx ); ++vertexUseCount[idx]; int idxNext = (vit==vitEnd-1) ? ib.front() : *(vit+1); int idxPrev = (vit==ib.begin()) ? ib.back() : *(vit-1); vertexNexts[idx].push_back( idxNext ); vertexPrevs[idx].push_back( idxPrev ); } }
int main() { #ifndef ONLINE_JUDGE ifstream fIn("input.txt"); cin.rdbuf( fIn.rdbuf() ); #endif int n; int m; cin >> n >> m; TBoolVector dummy(2*n, false); TMatrix g(2*n, dummy); for (int i = 0; i < m; ++i) { int a; int b; cin >> a >> b; --a; --b; g[a][b] = true; g[b][a] = true; } for (int i = 0; i < 2 * n; ++i) { g[i][i] = true; } TIntVector s; s.push_back(0); int next = 1; do { int i = next; for (; i < 2 * n; ++i) { int j = 0; while (j < s.size() && !g[s[j]][i]) { ++j; } if (j == s.size()) { break; } } if (i == 2 * n) { next = s.back() + 1; s.pop_back(); } else { next = 1; s.push_back(i); } } while (!s.empty() && s.size() != n); if (s.size() == n) { for (int i = 0; i < 2 * n; ++i) { if (find(s.begin(), s.end(), i) != s.end()) { cout << i + 1 << " "; } } cout << endl; for (int i = 0; i < 2 * n; ++i) { if (find(s.begin(), s.end(), i) == s.end()) { cout << i + 1 << " "; } } cout << endl; } else { cout << "IMPOSSIBLE\n"; } return 0; }