#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> space_cars;
vector<vector<int>> car_spaces;
vector<int> empty_spaces;
vector<pair<int,int>> moves;
queue<int> q_ready;
queue<int> q_top;
vector<bool> in_q;
bool is_matched(int c){
return car_spaces[c][0]==car_spaces[c][1];
}
void do_move(int u,int v);
void check_color(int c){
if(is_matched(c) or in_q[c])return;
int u=car_spaces[c][0];
int v=car_spaces[c][1];
if(space_cars[u].back()==c and space_cars[v].back()==c){
if(space_cars[u].size()==1 or space_cars[v].size()==1)q_ready.push(c);
else q_top.push(c);
in_q[c]=true;
}
return ;
}
void do_move(int u,int v){
int c=space_cars[u].back();
space_cars[u].pop_back();
space_cars[v].emplace_back(c);
moves.emplace_back(u,v);
if(car_spaces[c][0]==u)car_spaces[c][0]=v;
else car_spaces[c][1]=v;
if(space_cars[u].empty())empty_spaces.emplace_back(u);
else check_color(space_cars[u].back());
return ;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m;
space_cars.resize(m+1);
car_spaces.resize(n+1);
in_q.assign(n+1,false);
for(int i=1;i<=m;++i){
int b,t;
cin>>b>>t;
if(b!=0){
space_cars[i].emplace_back(b);
car_spaces[b].emplace_back(i);
}
if(t!=0){
space_cars[i].emplace_back(t);
car_spaces[t].emplace_back(i);
}
if(space_cars[i].empty())empty_spaces.emplace_back(i);
}
for(int i=1;i<=n;++i){
check_color(i);
}
int search_ptr=1;
while(true){
if(!q_ready.empty()){
int c=q_ready.front();
q_ready.pop();
if(is_matched(c))continue;
int u=car_spaces[c][0];
int v=car_spaces[c][1];
if(space_cars[u].size()==1 and space_cars[v].size()>1)do_move(v,u);
else do_move(u,v);
}
else if(!q_top.empty()){
int c=q_top.front();
q_top.pop();
if(is_matched(c))continue;
if(empty_spaces.empty()){
cout<<"-1\n";
return 0;
}
int e=empty_spaces.back();
empty_spaces.pop_back();
int u=car_spaces[c][0];
int v=car_spaces[c][1];
do_move(u,e);
do_move(v,e);
}
else{
int cycle_color=-1,top_space=-1;
while(search_ptr<=n){
int i=search_ptr;
if(!is_matched(i)){
int u=car_spaces[i][0];
int v=car_spaces[i][1];
bool u_is_top=(space_cars[u].back()==i and space_cars[u].size()==2);
bool v_is_top=(space_cars[v].back()==i and space_cars[v].size()==2);
if(u_is_top){
cycle_color=i;
top_space=u;
break;
}else if(v_is_top){
cycle_color=i;
top_space=v;
break;
}
}
++search_ptr;
}
if(cycle_color==-1)break;
if(empty_spaces.empty()){
cout<<"-1\n";
return 0;
}
int e=empty_spaces.back();
empty_spaces.pop_back();
do_move(top_space,e);
}
}
cout<<moves.size()<<"\n";
for(auto i:moves){
cout<<i.first<<" "<<i.second<<"\n";
}
return 0;
}