原题链接


C. NP-Hard Problem



time limit per test



memory limit per test



input



output


minimum vertex cover

G is given. Subset A of its vertices is called a vertex cover of this graph, if for each edge uv there is at least one endpoint of it in this set, i.e. 

Codeforces Round #360 (Div. 2) C. NP-Hard Problem_#include

 or 

Codeforces Round #360 (Div. 2) C. NP-Hard Problem_ios_02

 (or both).

Pari and Arya have won a great undirected graph as an award in a team contest. Now they have to split it in two parts, but both of them want their parts of the graph to be a vertex cover.

disjoint subsets of its vertices A and B, such that both A and B


Input


n and m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) — the number of vertices and the number of edges in the prize graph, respectively.

m lines contains a pair of integers ui and vi (1  ≤  ui,  vi  ≤  n), denoting an undirected edge between ui and vi. It's guaranteed the graph won't contain any self-loops or multiple edges.


Output


-1" (without quotes).

k denoting the number of vertices in that vertex cover, and the second line contains kintegers — the indices of vertices. Note that because of m ≥ 1, vertex cover cannot be empty.


Examples


input


4 21 2 2 3


output


12 2 1 3


input


3 31 2 2 3 1 3


output


-1


Note


2 to Arya and vertices numbered 1 and 3 to Pari and keep vertex number 4

In the second sample, there is no way to satisfy both Pari and Arya.



判断是否为二分图。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 100005
using namespace std;

vector<int> v[maxn], p[2];
int vis[maxn];
bool dfs(int i, int c){
	
	vis[i] = c;
	p[c].push_back(i);
	for(int j = 0; j < v[i].size(); j++){
		int h = v[i][j];
		if(vis[h] == c)
		  return false;
		if(vis[h] == -1){
			if(dfs(h, c^1) == false)
			  return false;
		}
	}
	return true;
}
int main(){
	
//	freopen("in.txt", "r", stdin);
	int n, m, a, b;
	
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; i++){
		scanf("%d%d", &a, &b);
		v[a].push_back(b);
		v[b].push_back(a);
	}
	memset(vis, -1, sizeof(vis));
	for(int i = 1; i <= n; i++){
		if(vis[i] == -1 && dfs(i, 0) == false){
			printf("%d\n", -1);
			return 0; 
		} 
	}
	for(int i = 0; i < 2; i++){
		printf("%d\n", p[i].size());
		for(int j = 0; j < p[i].size(); j++){
			printf("%d", p[i][j]);
			if(j < p[i].size()-1)
			  printf(" ");
		}
		if(p[i].size() > 0)
		puts("");
	}
	return 0;
}