#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
int n,m;
vector<int>park[200023];
pair<int,int>loc[200023];
set<int>st;
vector<pair<int,int>>ans;
vector<int>need[200023],boss[200023];
int vis[200023];
void move(int x,int y){
if(x!=y){
ans.pb({x,y});
int renk=park[x].back();
park[x].pop_back();
park[y].pb(renk);
if(loc[renk].fr==x)loc[renk].fr=y;
else loc[renk].sc=y;
if(park[y].size()==1)st.erase(y);
if(park[x].size()==0)st.insert(x);
}
if(park[y].size()==1){
int renk=park[y].back();
if(park[loc[renk].fr].back()==renk&&park[loc[renk].sc].back()==renk){
if(loc[renk].fr!=y){
move(loc[renk].fr,y);
}
else move(loc[renk].sc,y);
}
}
if(park[x].size()==1){
int renk=park[x].back();
if(park[loc[renk].fr].back()==renk&&park[loc[renk].sc].back()==renk){
if(loc[renk].fr!=x){
move(loc[renk].fr,x);
}
else move(loc[renk].sc,x);
}
}
}
signed main(){
ios_base::sync_with_stdio(23^23);cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;cin>>x>>y;
loc[x].fr=i;
swap(loc[x].fr,loc[x].sc);
loc[y].fr=i;
swap(loc[y].fr,loc[y].sc);
if(x)park[i].pb(x);
if(y)park[i].pb(y);
if(x==0&&y==0)st.insert(i);
}
for(int i=1;i<=m;i++){
move(i,i);
}
for(int i=1;i<=m;i++){
if(park[i].size()==2&&park[i][0]!=park[i][1]){
need[park[i][0]].pb(park[i][1]);
boss[park[i][1]].pb(park[i][0]);
}
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
if(need[i].size()!=1)continue;
if(boss[i].size())continue;
int pos=i;
vector<int>v;
vis[i]=1;
while(true){
int nex=-1;
if(need[pos].size()==0)v.pb(pos);
for(int x:need[pos]){
if(vis[x])continue;
nex=x;
vis[x]=1;
}
for(int x:boss[pos]){
if(vis[x])continue;
nex=x;
vis[x]=1;
}
if(nex==-1)break;
pos=nex;
}
for(int x:v){
if(!st.size()){
cout<<-1<<endl;
return 0;
}
move(loc[x].fr,*st.begin());
}
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
if(loc[i].fr==loc[i].sc)continue;
int pos=i;
vector<int>v;
vis[i]=1;
while(true){
int nex=-1;
if(need[pos].size()==0)v.pb(pos);
for(int x:need[pos]){
if(vis[x])continue;
nex=x;
vis[x]=1;
break;
}
if(nex==-1)for(int x:boss[pos]){
if(vis[x])continue;
nex=x;
vis[x]=1;
break;
}
if(nex==-1)break;
pos=nex;
}
if(!v.size()){
if(!st.size()){
cout<<-1<<endl;
return 0;
}
if(park[loc[i].fr].back()==i)move(loc[i].fr,*st.begin());
else move(loc[i].sc,*st.begin());
}
for(int x:v){
if(!st.size()){
cout<<-1<<endl;
return 0;
}
move(loc[x].fr,*st.begin());
}
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i].fr<<" "<<ans[i].sc<<endl;
}
}