#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define fi first
#define sc second
typedef pair<int,int> P;
typedef long long ll;
int n,m;
bool used[105][105];
struct uf{
	int par[105],sz[105];
	void init(){ rep(i,105) par[i] =i,sz[i]=1;}
	int find(int x){ if(x == par[x]) return x; else return par[x] = find(par[x]); }
	void unite(int x,int y){
		x = find(x); y = find(y); if(x == y) return;
		par[x] = y; sz[y] += sz[x];
	}
	bool same(int x,int y){ return find(x) == find(y); }
}kaede,co,cm;
vector<P>ans;
vector<int>C[105];
bool X[105];
bool dfs1(int v,int u){
	bool ret = X[v];
	rep(i,C[v].size()){
		int to = C[v][i];
		if(to == u) continue;
		ret ^= dfs1(to,v);
	}
	if(ret){
		ans.pb(P(min(u,v),max(u,v)));
	}
	return ret;
}
void solve1(){
	co.init();
	repn(i,n) for(int j=i+1;j<=n;j++){
		if(!used[i][j]) co.unite(i,j);
	}
	int cnt[105]={};
	repn(i,n){
		int x = 0;
		for(int j=1;j<=n;j++){
			x ^= used[min(i,j)][max(i,j)];
		}
		X[i]= x;
		if(x) cnt[co.find(i)]^=1;
	}
	repn(i,n){
		if(cnt[i]){
			puts("-1");
			exit(0);
		}
	}
	cm.init();
	repn(i,n) for(int j=i+1;j<=n;j++){
		if(!used[i][j] && !cm.same(i,j)){
			cm.unite(i,j);
			C[i].pb(j); C[j].pb(i);
		}
	}
	repn(i,n){
		if(cm.find(i) == i && C[i].size()){
			dfs1(i,-1);
		}
	}
	cout << ans.size() << endl;
	rep(i,ans.size()){
		int a = ans[i].fi, b = ans[i].sc;
		if(a > b) swap(a,b);
		cout << a << " " << b << endl;
	}
}
void solve2(){
	co.init();
	repn(i,n) for(int j=i+1;j<=n;j++) if(used[i][j]){
		co.unite(i,j);
	}
	vector<P>sz;
	repn(i,n) if(co.find(i) == i) sz.pb(P(co.sz[i],i));
	assert(sz.size() == 2); sort(sz.begin(),sz.end());
	//cout << sz[0].fi << sz[0].sc << sz[1].fi << sz[1].sc << endl;
	bool ex = 0;
	repn(i,n){
		int x = 0;
		for(int j=1;j<=n;j++){
			x ^= used[min(i,j)][max(i,j)];
		}
		X[i] = x; if(x) ex = 1;
	}
	if(!ex){
		if(sz[0].fi == 1){
			int x = sz[0].sc;
			repn(i,n) for(int j=i+1;j<=n;j++){
				if(i == x || j == x || used[i][j]) continue;
				ans.pb(P(x,i));
				ans.pb(P(x,j));
				goto ok;
			}
			puts("-1"); exit(0); ok:;
		}
		else{
			int x = sz[0].sc, y = sz[1].sc;
			vector<int>q,w;
			repn(i,n) if(co.find(i) == x) q.pb(i); else w.pb(i);
			assert(q.size() >= 2 && w.size() >= 2);
			ans.pb(P(q[0],w[0]));
			ans.pb(P(q[0],w[1]));
			ans.pb(P(q[1],w[0]));
			ans.pb(P(q[1],w[1]));
		}
	}
	else{
		int x = sz[0].sc, y = sz[1].sc;
		vector<int>q[2],w[2];
		repn(i,n) if(co.find(i) == x) q[X[i]].pb(i); else w[X[i]].pb(i);
		if(q[1].empty()){
			for(int i=0;i<w[1].size();i++){
				ans.pb(P(q[0][0],w[1][i]));
			}
		}
		else if(w[1].empty()){
			for(int i=0;i<q[1].size();i++){
				ans.pb(P(w[0][0],q[1][i]));
			}
		}
		else{
			for(int i=0;i<max(q[1].size(),w[1].size());i++){
				int a = (i<q[1].size()?q[1][i]:q[1].back());
				int b = (i<w[1].size()?w[1][i]:w[1].back());
				ans.pb(P(a,b));
			}
		}
	}
	cout << ans.size() << endl;
	rep(i,ans.size()){
		int a = ans[i].fi, b = ans[i].sc;
		if(a > b) swap(a,b);
		cout << a << " " << b << endl;
	}
}
int main(){
	cin >> n >> m;
	rep(i,m){
		int a,b; cin >> a >> b; used[a][b] = 1;
	}
	if(n%2 == 1){
		cout << n*(n-1)/2-m << endl;
		repn(i,n) for(int j=i+1;j<=n;j++) if(!used[i][j]) cout << i << " " << j << endl;
		return 0;
	}
	else{
		kaede.init();
		repn(i,n) for(int j=i+1;j<=n;j++) if(used[i][j]){
			kaede.unite(i,j);
		}
		multiset<P>vec;
		repn(i,n) if(kaede.find(i) == i) vec.insert(P(kaede.sz[i],i));
		
		if(vec.size() == 1){
			solve1();
		}
		else if(vec.size() == 2){
			solve2();
		}
		else{
			while(vec.size() > 2){
				auto it = vec.begin(); vec.erase(vec.begin());
				auto itt = vec.begin(); vec.erase(vec.begin());
				int v1 = (*it).sc, v2 = (*itt).sc;
				if(v1 > v2) swap(v1,v2);
				ans.pb(P(v1,v2)); used[v1][v2] = 1;
				kaede.unite(v1,v2);
				if(kaede.find(v1) == v1){
					vec.insert(P(kaede.sz[v1],v1));
				}
				else{
					assert(kaede.find(v2) == v2);
					vec.insert(P(kaede.sz[v2],v2));
				}
			}
			solve2();
		}
	}
}
			
			
			



Measured memory_bytes: 3176