/*
TASK:like
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
struct vrux{
  bool nech,need_fix;int used;
  vrux(bool _ne=false,bool _nf=false){nech=_ne;need_fix=_nf;used=0;}
};
struct edge{
  int f,t;char type;
  edge(int _f=0,int _t=0){f=_f;t=_t;type='?';}
  int next(int to){return((to==f)?t:f);}
};
int n,m;
vector<edge> U;
vector<int> fo[1010];
vector<vrux> vr;
// Proveri tova
void dfs(int v){
  vr[v].used=1;
  int i,j;
  vector<int> nf,ef; // nech nasl
  for(i=0;i<fo[v].size();++i){
   j=U[fo[v][i]].next(v);
   if(vr[j].used==0){dfs(j);if(vr[j].need_fix){nf.push_back(j);ef.push_back(fo[v][i]);}}
                              }
  for(i=0;i<nf.size();i+=2){
   j=i+1;if(j>=nf.size())break;
   if(U[ef[i]].t!=v)U[ef[i]].type='O';
   else U[ef[i]].type='P';
   if(U[ef[j]].t!=nf[j])U[ef[j]].type='O';
   else U[ef[j]].type='P';
                           }
  if(nf.size()%2==1){
   i=nf.size()-1;
   if(U[ef[i]].t!=v)U[ef[i]].type='O';
   else U[ef[i]].type='P';
                    }
  if(vr[v].nech && nf.size()%2==0)vr[v].need_fix=true;
  if(!vr[v].nech && nf.size()%2==1)vr[v].need_fix=true;
}
// Ojlerov cikul
void ojler_dfs(int v){
  int i,j;
  for(i=0;i<fo[v].size();++i){
   j=U[fo[v][i]].next(v);
   if(U[fo[v][i]].type=='?'){
    if(U[fo[v][i]].t==j)U[fo[v][i]].type='P';
    else U[fo[v][i]].type='O';
    ojler_dfs(j);
                            }
                             }
}
int main(){
  int i,j,k,l;
  //system("pause");
  scanf("%d%d",&n,&m);
  for(i=0;i<m;++i){
   scanf("%d%d",&k,&l);
   k--;l--;
   U.push_back(edge(k,l));
   fo[k].push_back(U.size()-1);fo[l].push_back(U.size()-1);
                  }
  vr.resize(n);
  for(i=0;i<n;++i)if(fo[i].size()%2==1)vr[i].nech=true;
  for(i=0;i<n;++i)
   if(vr[i].used==0)dfs(i);
  for(i=0;i<n;++i)ojler_dfs(i);
  printf("Yes\n");
  for(i=0;i<m;++i){
   if(U[i].type=='P')printf("%d %d\n",U[i].f+1,U[i].t+1);
   else printf("%d %d\n",U[i].t+1,U[i].f+1);
                  }
  return 0;
}
