#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <list>
#include <algorithm>

#define MAXN    1004
#define MAXM    100004

#define GRAY    1
#define BLACK   2

using namespace std;


struct Edge {
  int a, b;
  list < int >::iterator it1, it2;
  int tree_direction;
};
Edge edge[MAXM];

list < int > node[MAXN];
int cookie[MAXN];
bool done[MAXN];
int n, m;

int perm[MAXN];
int inv_perm[MAXN];

int tajm;
int cycle;
int start_node;

#define INVPERM(x) inv_perm[x]




void erase_edge( int indeks, int first ) {
  Edge *e = edge + indeks;
  node[ e->a ].erase( e->it1 );
  node[ e->b ].erase( e->it2 );
  if ( first == e->a )
    printf("%d %d\n", INVPERM( e->a ), INVPERM( e->b ));
  else
    printf("%d %d\n", INVPERM( e->b ), INVPERM( e->a ));
}


int DFS( int x, int parent ) {
  if ( cookie[x] != tajm ) {  /* white node */
    cookie[x] = tajm;
  } else {                    /* gray node */
    cycle = true;
    start_node = x;
    return 1;
  }
  
  for ( list < int >::iterator it = node[x].begin(); it != node[x].end(); ++it ) {
    int target = edge[*it].a == x ? edge[*it].b : edge[*it].a;
    if ( target == parent ) continue;
    
    int return_value = DFS( target, x );
    if ( return_value == 1 ) {
      erase_edge( *it, x );
      return start_node != x ? 1 : 2;
    } else if ( return_value == 2 )
      return 0;
  }
  
  return 0;
}


void solve_tree( int x, int parent, int delta ) {
  for ( list < int >::iterator it = node[x].begin(); it != node[x].end(); ++it ) {
    int target = edge[*it].a == x ? edge[*it].b : edge[*it].a;
    if ( target == parent ) continue;
    
    if ( delta >= 0 ) {
      edge[ *it ].tree_direction = 1;
      solve_tree( target, x, 1 );
      --delta;
    } else {
      edge[ *it ].tree_direction = -1;
      solve_tree( target, x, -1 );
      ++delta;
    }
  }
  
  done[x] = true;
}



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

  for ( int i = 1; i <= n; ++i )
    perm[i] = i;
  random_shuffle( perm+1, perm + n+1 );
  for ( int i = 1; i <= n; ++i )
    inv_perm[ perm[i] ] = i;

  for ( int i = 0; i < m; ++i ) {
    int a, b;
    scanf("%d%d", &a, &b);
    a = perm[a];
    b = perm[b];
    
    edge[i].a = a;
    edge[i].b = b;
    edge[i].it1 = node[a].insert( node[a].end(), i );
    edge[i].it2 = node[b].insert( node[b].end(), i );    
  }
  
  
  printf("Yes\n");
  
  for ( int i = 0; i < n; ++i ) {
    for ( ; !node[i].empty() && !done[i]; ) {
      ++tajm;
      cycle = false;

      DFS( i, -1 );
      if ( cycle ) continue;
      solve_tree( i, -1, 0 );
      break;
    }
  }
  
  for ( int i = 0; i < m; ++i ) {
    if ( edge[i].tree_direction == 0 ) continue;
    if ( edge[i].tree_direction == 1 ) {
      printf("%d %d\n", INVPERM( edge[i].a ), INVPERM( edge[i].b ));
    } else {
      printf("%d %d\n", INVPERM( edge[i].b ), INVPERM( edge[i].a ));
    }
  }
  
  return 0;
}
