/*
PROB: like
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <vector>
#include <cmath>
#include <cstring>
#include <set>
#include <algorithm>
#if 0
#define eprintf(msg,...) fprintf( stderr , "Line %d: " msg "\n", __LINE__, ##__VA_ARGS__ )
#else
#define eprintf(...) 0
#endif

using namespace std;

typedef long long ll;

const int MAXN = 1 << 10;
const int MAXM = 1 << 17;

int N,M;

int graph[MAXN][MAXN];

int used[MAXN][MAXN];
int edges[MAXM][2];
int indeg[MAXN];
int outdeg[MAXN];

int check( int state ){
    memset( indeg , 0 , sizeof( indeg ) );
    memset( outdeg , 0 , sizeof( outdeg ) );
    
    for( int i = 0 ; i < M ; i++ ){
        if( state & ( 1 << i ) ){
            indeg[ edges[i][1] ]++; 
            outdeg[ edges[i][0] ]++;
        }else{
            indeg[ edges[i][0] ]++;
            outdeg[ edges[i][1] ]++;
        }
    }
    
    int isk = 1;
    
    for( int i = 0 ; i < N ; i++ ){
        if( indeg[i] == outdeg[i] or indeg[i] - 1 == outdeg[i] or outdeg[i] - 1 == indeg[i] )
          continue;
        else
          isk = 0;
    }
    
    return isk;
}
int slow(){
  for( int i = 0 ; i < ( 1 << M ) ; i++ ){
        if( check( i ) ){
            
            printf("Yes\n");
            for( int j = 0 ; j < M ; j++ ){
                if( i & ( 1 << j ) ){
                  printf("%d %d\n", 1+edges[j][0], 1+edges[j][1]); 
                }else{
                  printf("%d %d\n", 1+edges[j][1], 1+edges[j][0]);
                }
            }
            
            return 1;
        }
    }
    
    printf("No\n"); 
    return 0;
}

void dfs( int v ){
  for( int i = 0 ; i < N ; i++ ){
    if( graph[v][i] and !used[v][i] ){
      used[v][i] = 1;/// do not go again from here
      eprintf("Edge %d -> %d", v+1,i+1);
      graph[i][v] = 0;/// direct the edge
      dfs(i);
    }
  }
}

int fast(){
    memset( used , 0 , sizeof( used ) );
    
    for( int i = 0 ; i < N ; i++ )
      dfs( i );

    memset( indeg , 0 , sizeof( indeg ) );
    memset( outdeg , 0 , sizeof( outdeg ) );
    
    for( int i = 0 ; i < N ; i++ ){
      for( int j = 0 ; j < N ; j++ ){
        indeg[i] += graph[j][i];
        outdeg[i] += graph[i][j]; 
      }
    }
    
    int isok=1;
    
    for( int i = 0 ; i < N ; i++ ){
      if( indeg[i] == outdeg[i] or indeg[i] - 1 == outdeg[i] or outdeg[i] - 1 == indeg[i] )
        continue;
      else{
        eprintf("Not OK because of node %d ( %d / %d )", i+1, indeg[i], outdeg[i]);
        isok = 0;
      }
    }
  
    if( !isok ){
      printf("No\n");
    }else{
      printf("Yes\n");
      for( int i = 0 ; i < N ; i++ ){
        for( int j = 0 ; j < N ; j++ ){
          if( graph[i][j] )
            printf("%d %d\n", i+1,j+1); 
        }
      }
    }
  
  return isok;
}

int main( int argc, char* argv[] ){
    //freopen( "like.in" , "r" , stdin );
    //freopen( "like.out" , "w" , stdout );
    
    scanf("%d %d", &N, &M);
    
    for( int i = 0 ; i < M ; i++ ){
        int a,b;
        scanf("%d %d", &a, &b);
        a--,b--;
        
        graph[a][b] = graph[b][a] = 1;   
        edges[i][0] = a, edges[i][1] = b;
    }
    
    for( int i = 0 ; i < M ; i++ ){
      eprintf("Edge #%d -> %d %d", i, edges[i][0], edges[i][1]);
    }
  
    if( N <= 20 and M <= 20 )
      slow();
    else
      fast();
  
    return 0;
}
