//bazinga ;)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int MAXN = 1 << 10;

int n , m;

int c[MAXN];
int checker[MAXN];
int edge[MAXN][MAXN];

int b[MAXN][MAXN];
vector < int > a[MAXN] , r;
int used[MAXN];

void read() {
	int i;
	int temp;
	int x , y;
	
	temp = scanf ( "%d%d" , &n , &m );
	
	for (i = 1; i <= m; i++) {
		temp = scanf ( "%d%d" , &x , &y );
		
		a[x].push_back ( y );
		a[y].push_back ( x );
		b[x][y] = b[y][x] = 1;
		
		++ c[y];
		-- c[x];
	}
}

int dfs ( int x ) {
	int i;
	
	for (i = 1; i <= n; i++)
		if ( b[x][i] == 1 ) {
			b[x][i] = b[i][x] = 0;
			if ( dfs ( i ) )
				break;
		}
		
	r.push_back ( x );
// 	printf ( " -- %d\n" , x );
	return 1;
}

int check () {
	int i , j;
	
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++) {
			if ( edge[i][j] == 1 )
				-- checker[i];
			if ( edge[i][j] == 2 )
				++ checker[i];
		}
		
	for (i = 1; i <= n; i++) {
// 		printf ( " -- %d %d\n" , i , checker[i] );
		if ( abs ( checker[i] ) > 1 )
			return 0;
	}
		
	return 1;
}

void solve() {
	int i , j;
	
	for (i = 1; i <= n; i++) 
		if ( (int)a[i].size() & 1 )
			if ( !used[i] ) {
				r.clear();
				dfs ( i );
// 				printf ( "\n" );
				
				used[i] = 1;
				used[ r[0] ] = 1;
				
				for (j = 0; j + 1 < (int)r.size(); j++) {
					edge[ r[j] ][ r[j + 1] ] = 1;
					edge[ r[j + 1] ][ r[j] ] = 2;
				}
			}
	
	if ( !check() ) {			printf ( "No\n" );			return ;		}
		
	printf ( "Yes\n" );
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			if ( edge[i][j] == 1 )
				printf ( "%d %d\n" , i , j );
}

int main() {
	read();
	solve();
	
	return 0;
}
