#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

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

int n , m;
int c[MAXN];

int cnt;
int next[MAXM];
int cap[MAXM];
int to[MAXM];
int last[MAXN];
int source , sink;

int d[MAXN];

int edge[MAXN][MAXN];

int used[MAXN];
int q[MAXN] , w[MAXN];
int comp;

vector < int > ss[MAXN];
int checker[MAXN];

void add_edge ( int x , int y , int cp ) {
// 	printf ( "add edge  %d %d   %d\n" , x , y , cp );
	to[cnt] = y;
	to[cnt + 1] = x;
	
	next[cnt] = last[x];
	next[cnt + 1] = last[y];
	
	cap[cnt] = cp;
	cap[cnt + 1] = 0;
	
	last[x] = cnt;
	last[y] = cnt + 1;
	
	cnt += 2;
}

void read() {
	int i;
	int temp;
	int x , y;
	
	temp = scanf ( "%d%d" , &n , &m );
	
	cnt = 2;
	source = n + 1;
	sink = source + 1;
	for (i = 1; i <= n + 2; i++)
		last[i] = 0;
	
	for (i = 1; i <= m; i++) {
		temp = scanf ( "%d%d" , &x , &y );
		
		if ( rand() & 1 ) swap ( x , y );
		
// 		printf ( "%d %d\n" , x , y );
		add_edge ( x , y , 1 );
		
		edge[x][y] = 1;
		edge[y][x] = 2;
		
		ss[x].push_back ( y );
		ss[y].push_back ( x );
		
		++ c[y];
		-- c[x];
	}
}

int bfs() {
	static int q[MAXN];
	int st;
	int i , j;
	
	for (i = 1; i <= n + 2; i++)
		d[i] = -1;
	
	d[sink] = 0;
	q[st = 0] = sink;
	
	for (i = 0; i <= st; i++) {
// 		printf ( "%d\n" , q[i] );
		for (j = last[ q[i] ]; j > 0; j = next[j]) {
// 			printf ( "%d %d    %d\n" , q[i] , to[j] , j );
			if ( d[ to[j] ] == -1 && cap[j ^ 1] ) {
				d[ to[j] ] = d[ q[i] ] + 1;
				q[ ++ st ] = to[j];
			}
		}
	}
			
	return d[source] != -1;
}

int dfs ( int x , int flow ) {
// 	printf ( "%d %d\n" , x , flow );
	if ( x == sink ) return flow;
	
	int i;
	int t;
	
	for (i = last[x]; i > 0; i = next[i]) {
// 		printf ( "%d    %d %d %d\n" , i , x , to[i] , cap[i] );
		if ( d[ to[i] ] == d[x] - 1 && cap[i] ) {
			if ( (t = dfs ( to[i] , min ( flow , cap[i] ) )) ) {
				cap[i] -= t;
				cap[i ^ 1] += t;
				
				return t;
			}
		}
	}
	
	d[x] = -5;
	return 0;
}

void dfs2 ( int x ) {
	used[x] = comp;
	int i;
	
	if ( c[x] < 0 )
		q[comp] += (- c[x]) / 2;
	else
		w[comp] += c[x] / 2;
	
	for (i = 0; i < (int)ss[x].size(); i++)
		if ( !used[ ss[x][i] ] )
			dfs2 ( ss[x][i] );
}

int check () {
	int i , j;
	
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++) {
// 			if ( edge[i][j] == 1 )				printf ( "%d %d   %d\n" , i , j , edge[i][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 flow , ans = 0;
	int i , j;
	int need = 0;
	int cp;
	
	for (i = 1; i <= n; i++) 
		if ( !used[i] ) {
			++ comp;
			dfs2 ( i );
		
			need += max ( q[comp] , w[comp] );
			
		}
	
	for (j = 1; j <= comp; j++)
	if ( q[j] > w[j] ) {
		for (i = 1; i <= n; i++) 
			if ( used[i] == j ) {
				
			if ( c[i] < 0 )
				add_edge ( source , i , (- c[i]) / 2 );
			else {
				cp = c[i] / 2;
				
				if ( c[i] & 1 ) {
					if ( q[j] != w[j] ) {
						-- q[j];
						++ cp;
					}
				}
				
				add_edge ( i , sink , cp );
			}
		}
	} else {
		for (i = 1; i <= n; i++) 
		if ( used[i] == j ) {
			if ( c[i] < 0 ) {
				cp = (- c[i]) / 2;
				
				if ( c[i] & 1 ) {
					if ( q[j] != w[j] ) {
						-- w[j];
						cp ++;
					}
				}
				
				add_edge ( source , i , cp );
			} else {
				add_edge ( i , sink , c[i] / 2 );
			}
		}
	}
	
// 	for (i = 1; i <= n; i++)		printf ( "C %d  %d\n" , i , c[i] );
	
	while ( bfs() ) {
// 		printf ( "%d\n" , d[source] );
// 		break;
		while ( (flow = dfs ( source , 1 << 30 )) )
			ans += flow;
// 		break;
	}
	
// 	printf ( "%d %d\n" , ans , need );
		
// 	return ;
	if ( ans != need )
		printf ( "fail\n" );
	else {
		for (i = 2; i < cnt; i += 2) {
			if ( !cap[i] && to[i] != source && to[i] != sink && to[i + 1] != source && to[i + 1] != sink ) {
// 				printf ( "   %d %d      %d %d\n" , i , i + 1 , to[i] , to[i + 1] );
				swap ( edge[ to[i] ][ to[i + 1] ] , edge[ to[i + 1] ][ to[i] ] );
			}
		}
		
		if ( !check() ) {			printf ( "fail\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;
}
