#ifdef __GNUC__ 
#pragma GCC optimize(2)
#endif

#include <cassert>
#include <iostream>
#include <functional>
#include <iomanip>
#include <set>
#include <unordered_map>
#include <map>
#include <queue>
#include <stack>
#include <complex>
#include <vector>
#include <deque>
#include <algorithm>
#include  <cstring>
#include <string>
#include <cmath> 
#include <random>

#pragma warning(disable: 4996)

using namespace std;
 
namespace Bigcat {
	template <typename T> inline void max_s(T&a, const T&b) { a = max(a, b); }
	template <typename T> inline void min_s(T&a, const T&b) { a = min(a, b); }

	template <typename T>  void sort_v(T & x) { sort(x.begin(), x.end()); }
	template <typename T>  void erase_dup(T & x) { x.erase(unique(x.begin(), x.end()), x.end()); }    // erase duplicate
	template <typename T, typename V>  int pos_l(const T & x, const V & v) { return lower_bound(x.begin(), x.end(), v) - x.begin(); }
	template <typename T, typename V>  int pos_u(const T & x, const V & v) { return upper_bound(x.begin(), x.end(), v) - x.begin(); }

	inline unsigned rand_g() {
		static mt19937 mt_rand((int)time(0));
		return mt_rand();
	}
	using LL = long long;
	using VI = vector<int>;
	using VVI = vector< VI >;
	using VL = vector<LL>;
	using PII = pair<int, int>;
	using VPII = vector< PII >;
}
#define Rep(i, a) for(int i = 0; i < (int)(a); i++)
#define Loop(i, a, b) for(int i = (int)(a); i < (int)(b); i++)
#define Loop_r(i, n) for(int i = (int)(n) - 1; i >= 0; i--)

    using namespace Bigcat;
const LL base = LL(1e9 + 7);
const LL INFL =  1LL << 62;
const int INF = 1 << 30 ;
const int MAX = int ( 1e5 + 100 ) ;

struct Node {
	int a, b;
	bool f;
};

VI gr[MAX];
int n, m;
bool vis[MAX];
int start;
Node es[MAX];
bool dfs(int v, int par  ) {
	vis[v] = true;
	for (auto & g : gr[v]) {
		auto & e = es[g];
		if (!e.f) continue;
		int x;
		if (e.a == v) x = e.b;
		else x = e.a;
		if (x == par) continue;
		if (x == start) { 
			e.f = false;
			return true;
		}
		if (vis[x]) continue;
		if (dfs(x, v)) {
			e.f = false;
			return true;
		}
	}
	return false;
}

bool circle() {
	memset(vis, false, sizeof(vis));
	Rep(i, m) {
		if (es[i].f == false) continue;
		start = es[i].a;
		bool f = dfs(start, -1);
		if (f) return true;
		else return false;
	}
	return false;
}
void solve1() {

	LL result = 0;

	cin >> n>>m;
	Rep(i, m) {
		int a, b;
		cin >> a >> b;
		gr[a].push_back(i);
		gr[b].push_back(i);
		es[i] = { a,b, true };
	}

	 
	Loop(i, 1, n + 1) {
		if (gr[i].size() % 2) {
			cout << "No" << endl;
			return;
		}
	}
	Rep(i, 3) {
		bool f;
		f = circle();
		Rep(j, 0) {
			if (es[j].f == false) continue;
			cout << es[j].a << ' ' << es[j].b << endl;
		}
		if (!f) {
			cout << "No" << endl;
			return;
		}
	}
	cout << "Yes" << endl;

}

void io_init() {
   	const int inId = 3;
	const int outId = 0;
	if (inId>0) {
		cerr << "redirect stdin to input " << inId << endl;
		string s = "input";
		s += to_string(inId);
		s += ".txt";
		auto r = freopen(s.c_str(), "r", stdin);
		if (r == nullptr) {
			cerr << "invalid input file " << s << endl;;
			r = freopen("CON", "r", stdin); // to do  con??
		}
	}
	if (outId>0) {
		cerr << "redirect stdout to stdout " << outId << endl;
		string s = "stdout";
		s += to_string(outId);
		s += ".txt";
		auto r = freopen(s.c_str(), "w", stdout);
		if (r == nullptr) {
			cerr << "invalid output file " << s << endl;;
			r = freopen("CON", "w", stdout);
		}
	}
}
void solve() {
	int t = 1;
	//cin >> t;
#ifdef _DEBUG
	cerr << " now base "<< base << endl;
#endif
	for (int i = 0; i < t; ++i) {
 #ifdef _DEBUG
    cerr<<" tasks: " << i+1<<endl;
#endif       
		solve1();
	}
    int x = 1;
}

int main(int argc,  char * argv[]) {
    
#ifdef _DEBUG    
	if (argc ==1) {
		io_init();
	}
#endif
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // close sync between cout and printf
	cout.precision(11); 
    
	solve();
}


Measured memory_bytes: 10112