#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define N 100010
#define NO !printf("-1\n")
typedef long long ll;
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}
int n,m,vis[N],t[N],x[N],y[N];
int d[N];
vector<pair<int,int> > G[N];
void dfs1(int u){
	vis[u]=1;
	for(auto qwq:G[u]){
		int v=qwq.first;
		if(vis[v])continue;
		t[qwq.second]=1;
		dfs1(v);
	}
}
void dfs2(int u,int fa){
	for(auto qwq:G[u]){
		int v=qwq.first;
		if(!t[qwq.second]||v==fa)continue;
		dfs2(v,u);
	}
	if(!fa)return;
	if(d[u]&1){
		++d[u];
		printf("%d %d\n",u,fa);
	}
	else{
		++d[fa];
		printf("%d %d\n",fa,u);
	}
}
int main(){
	n=read(),m=read();
	if(m&1)return NO;
	for(int i=1;i<=m;++i){
		int u=read(),v=read();
		G[u].emplace_back(v,i);
		G[v].emplace_back(u,i);
		x[i]=u,y[i]=v;
	}
	dfs1(1);
	for(int i=1;i<=m;++i){
		if(!t[i]){
			printf("%d %d\n",x[i],y[i]);
			++d[x[i]];
		}
	}
	dfs2(1,0);
	return 0;
}



### Prompt

Create a solution in Cpp for the following problem:

You are given a simple connected undirected graph with N vertices and M edges. The vertices are numbered 1 to N, and the i-th edge connects Vertex A_i and Vertex B_i. Takahashi will assign one of the two possible directions to each of the edges in the graph to make a directed graph. Determine if it is possible to make a directed graph with an even number of edges going out from every vertex. If the answer is yes, construct one such graph.

Constraints

* 2 \leq N \leq 10^5
* N-1 \leq M \leq 10^5
* 1 \leq A_i,B_i \leq N (1\leq i\leq M)
* The given graph is simple and connected.

Input

Input is given from Standard Input in the following format:


N M
A_1 B_1
:
A_M B_M


Output

If it is impossible to assign directions to satisfy the requirement, print -1. Otherwise, print an assignment of directions that satisfies the requirement, in the following format:


C_1 D_1
:
C_M D_M


Here each pair (C_i, D_i) means that there is an edge directed from Vertex C_i to Vertex D_i. The edges may be printed in any order.

Examples

Input

4 4
1 2
2 3
3 4
4 1


Output

1 2
1 4
3 2
3 4


Input

5 5
1 2
2 3
3 4
2 5
4 5


Output

-1

### Response

```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define N 100010
#define NO !printf("-1\n")
typedef long long ll;
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}
int n,m,vis[N],t[N],x[N],y[N];
int d[N];
vector<pair<int,int> > G[N];
void dfs1(int u){
	vis[u]=1;
	for(auto qwq:G[u]){
		int v=qwq.first;
		if(vis[v])continue;
		t[qwq.second]=1;
		dfs1(v);
	}
}
void dfs2(int u,int fa){
	for(auto qwq:G[u]){
		int v=qwq.first;
		if(!t[qwq.second]||v==fa)continue;
		dfs2(v,u);
	}
	if(!fa)return;
	if(d[u]&1){
		++d[u];
		printf("%d %d\n",u,fa);
	}
	else{
		++d[fa];
		printf("%d %d\n",fa,u);
	}
}
int main(){
	n=read(),m=read();
	if(m&1)return NO;
	for(int i=1;i<=m;++i){
		int u=read(),v=read();
		G[u].emplace_back(v,i);
		G[v].emplace_back(u,i);
		x[i]=u,y[i]=v;
	}
	dfs1(1);
	for(int i=1;i<=m;++i){
		if(!t[i]){
			printf("%d %d\n",x[i],y[i]);
			++d[x[i]];
		}
	}
	dfs2(1,0);
	return 0;
}



```