#include <stdio.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <set>
using namespace std;

#define MaxN 1000
#define MaxM 100000

int n,m;
int p1,p2;

set<int> plusGraph[MaxN];
set<int> minusGraph[MaxN];
set<int> plus1;
set<int> minus1;

vector<int> poc[MaxN];
int d[MaxN];

bool mark[MaxN];

void Solve()
{

	int nu,pl,mi;
	int k;
	int size;
	for (int p = 0; p < n; ++p) { // ubaci node sa id = p
		nu = pl = mi = 0;

		size = poc[p].size();
		for (int i = 0; i < size; ++i) {
			if ( !mark[ poc[p][i] ] ) continue;

			if ( d[ poc[p][i] ] == 0 )  nu++;
			if ( d[ poc[p][i] ] == -1 ) mi++;
			if ( d[ poc[p][i] ] == 1 )  pl++;
		}

		if ( nu == 0 && mi == 0 && pl == 0 ) {
			d[p] = 0;
			mark[p] = true;
			continue;
		}

		k = pl - mi;
		if ( abs( pl - mi ) <= nu+1 ) { // moze bez menjanja graph-a
			for (int i = 0; i < size; ++i) {
				if ( !mark[ poc[p][i] ] ) continue;

				if ( d[ poc[p][i] ] == -1 ) {
				   d[ poc[p][i] ] = 0;
				   plusGraph[ poc[p][i] ].insert( p );
				   minusGraph[ p ].insert( poc[p][i] );

				   minus1.erase( minus1.find( poc[p][i] ) );
				}
				else if ( d[ poc[p][i] ] == 1 ) {
				   d[ poc[p][i] ] = 0;
				   minusGraph[ poc[p][i] ].insert( p );
				   plusGraph[ p ].insert( poc[p][i] );

				   plus1.erase( plus1.find( poc[p][i] ) );
				}
				else if ( d[ poc[p][i] ] == 0 ) {
					if ( k > 0 ) {
						d[ poc[p][i] ] = 1;
					    plusGraph[ poc[p][i] ].insert( p );
					    minusGraph[ p ].insert( poc[p][i] );
						k--;

						plus1.insert( poc[p][i] );
					}
					else {
						d[ poc[p][i] ] = -1;
					    minusGraph[ poc[p][i] ].insert( p );
					    plusGraph[ p ].insert( poc[p][i] );
						k++;

						minus1.insert( poc[p][i] );
					}
				}
			}
			if ( k > 0 ) {
				minus1.insert( p );
			}
			if ( k < 0 ) {
				plus1.insert( p );
			}

		}
		else { // menjaj graph
		  printf("No\n");
		  exit(0);
		  if ( k < 0 ) {

		  }
		  else {
		  }
		}

		mark[p] = true;
	}

}

void doIt( int n, int m )
{

  int size = 1 << m;
  bool ok;
  for (int i = 0; i < size; ++i) {
    memset(d, 0, sizeof(d));
    ok = true;

    int p = 0;
    int size;
    for (int j = 0; j < n; ++j) {
       size = poc[j].size();
       for (int k = 0; k < size; ++k) {
           if ( poc[j][k] > j ) {
               if ( ( i & ( 1 << p ) ) > 0 ) {
                  d[j]++;
                  d[ poc[j][k] ]--;
               }
               else {
                  d[j]--;
                  d[ poc[j][k] ]++;
               }
               p++;
           }
       }
    }

    for (int j = 0; j < n; ++j) {
      if ( abs( d[j] ) > 1 ) {
        ok = false;
        break;
      }
    }

    if ( !ok ) continue;

    printf("Yes\n");
    p = 0;
    for (int j = 0; j < n; ++j) {
      size = poc[j].size();
      for (int k = 0; k < size; ++k) {
        if ( poc[j][k] > j ) {
          if ( ( i & ( 1 << p ) ) > 0 )
            printf("%d %d\n",j+1,poc[j][k]+1);
          else
            printf("%d %d\n",poc[j][k]+1,j+1);

          p++;
        }
      }
    }
    return;

  }

  printf("No\n");

}

int main()
{
	scanf("%d%d",&n,&m);

	for (int i = 0; i < n; ++i) {
		minusGraph[i].clear();
		plusGraph[i].clear();
	}
	plus1.clear();
	minus1.clear();
	memset(mark, 0, sizeof(mark));
	memset(d, 0, sizeof(d));

	for (int i = 0; i < m; ++i) {
		scanf("%d%d",&p1,&p2);
		p1--; p2--;
		poc[p1].push_back( p2 );
		poc[p2].push_back( p1 );
	}

	if ( n <= 20 && m <= 20 ) {
	  doIt(n,m);
	  return 0;
  }


	Solve();

	printf("Yes\n");
	for (int i = 0; i < n; ++i) {
		set<int>::iterator size = plusGraph[i].end();

    for (set<int>::iterator j = plusGraph[i].begin(); j != size; ++j)
      printf("%d %d\n",i+1,(*j)+1);
	}

	return 0;

}
