// Mihai Priboi
#include <stdio.h>
#include <vector>
using namespace std;
FILE *fin, *fout;
#define MAXN 100000
vector<int> muchii[MAXN + 1];
bool noduri[MAXN + 1];
pair<int, int> drum[MAXN + 1];
int ind;
void dfs( int nod, int last_node ) {
int i;
if( last_node > -1 ) {
drum[ind].first = last_node;
drum[ind++].second = nod;
}
noduri[nod] = true;
for( i = 0; i < muchii[nod].size(); i++ )
if( !noduri[muchii[nod][i]] )
dfs( muchii[nod][i], nod );
}
int main() {
int n, m, i, x, y, cnx;
fin = fopen( "mesaj4.in", "r" );
fscanf( fin, "%d%d", &n, &m );
for( i = 0; i < m; i++ ) {
fscanf( fin, "%d%d", &x, &y );
muchii[x].push_back(y);
muchii[y].push_back(x);
}
fclose( fin );
dfs( 1, -1 ); // facem dfs pe un punct random ( 1 in cazul de fata :) )
cnx = 1;
for( i = 1; i <= n; i++ ) {
if( !noduri[i] )
cnx = 0;
noduri[i] = 0;
}
fout = fopen( "mesaj4.out", "w" );
if( cnx == 0 )
fprintf( fout, "-1" );
else {
fprintf( fout, "%d\n", 2 * (n - 1) );
for( i = 0; i < ind; i++ )
fprintf( fout, "%d %d\n", drum[i].first, drum[i].second );
for( i = ind - 1; i >= 0; i-- )
fprintf( fout, "%d %d\n", drum[i].second, drum[i].first );
}
fclose( fout );
return 0;
}