#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector> 
#define PII pair<int,int>
#define MP make_pair
#define fir first
#define sec second
#define PB push_back
#define db long double
#define ll long long
using namespace std;
template <class T>
inline void rd(T &x) {
	x=0; char c=getchar(); int f=1;
	while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); }
	while(isdigit(c)) x=x*10-'0'+c,c=getchar(); x*=f;
}
const int N=1e5+10;
vector<int> G[N],E[N];
int n,m,vis[N];
int d[N];
void dfs1(int u,int last) {
	vis[u]=1;
	for(int i=0;i<G[u].size();++i) {
		int v=G[u][i]; if(v==last) continue;
		if(vis[v]) {
			if(u>v) {
				printf("%d %d\n",u,v);
				d[u]^=1;
			}
		}
		else {
			dfs1(v,u);
			E[u].PB(v);
		}
	}
}
void dfs2(int u,int last) {	
	for(int i=0;i<E[u].size();++i) dfs2(E[u][i],u);
	if(last) {
		if(d[u]) printf("%d %d\n",u,last);
		else printf("%d %d\n",last,u),d[last]^=1;
	}
}
int main() {
	rd(n),rd(m);
	for(int x,y,i=1;i<=m;++i) rd(x),rd(y),G[x].PB(y),G[y].PB(x);
	if(m&1) { printf("-1"); exit(0); }
	dfs1(1,0);
	dfs2(1,0);
	return 0;
}
### Prompt

Please formulate a Cpp solution to 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 <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector> 
#define PII pair<int,int>
#define MP make_pair
#define fir first
#define sec second
#define PB push_back
#define db long double
#define ll long long
using namespace std;
template <class T>
inline void rd(T &x) {
	x=0; char c=getchar(); int f=1;
	while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); }
	while(isdigit(c)) x=x*10-'0'+c,c=getchar(); x*=f;
}
const int N=1e5+10;
vector<int> G[N],E[N];
int n,m,vis[N];
int d[N];
void dfs1(int u,int last) {
	vis[u]=1;
	for(int i=0;i<G[u].size();++i) {
		int v=G[u][i]; if(v==last) continue;
		if(vis[v]) {
			if(u>v) {
				printf("%d %d\n",u,v);
				d[u]^=1;
			}
		}
		else {
			dfs1(v,u);
			E[u].PB(v);
		}
	}
}
void dfs2(int u,int last) {	
	for(int i=0;i<E[u].size();++i) dfs2(E[u][i],u);
	if(last) {
		if(d[u]) printf("%d %d\n",u,last);
		else printf("%d %d\n",last,u),d[last]^=1;
	}
}
int main() {
	rd(n),rd(m);
	for(int x,y,i=1;i<=m;++i) rd(x),rd(y),G[x].PB(y),G[y].PB(x);
	if(m&1) { printf("-1"); exit(0); }
	dfs1(1,0);
	dfs2(1,0);
	return 0;
}
```