#include <bits/stdc++.h>
using namespace std;
template <class T>
using vv = vector<vector<T>>;
template <class T>
ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  for (int(i) = 0; (i) < (t.size()); ++(i)) {
    os << t[i] << ",";
  }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
const long long MOD = 1e9 + 7;
int g[512][512], d[512];
int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  int n, m;
  cin >> n >> m;
  int x, y;
  fill(g[0], g[0] + 512 * 512, 1);
  for (int(i) = 0; (i) < (m); ++(i)) {
    cin >> x >> y;
    --x;
    --y;
    g[x][y] = g[y][x] = 0;
  }
  fill(d, d + 512, MOD);
  queue<int> que;
  for (int(i) = 0; (i) < (n); ++(i))
    if (accumulate(g[i], g[i] + n, 0) != 1) {
      d[i] = 0;
      que.push(i);
      break;
    }
  while (que.size()) {
    int t = que.front();
    que.pop();
    for (int(i) = 0; (i) < (n); ++(i))
      if (d[i] == MOD && g[t][i]) {
        d[i] = d[t] + 1;
        que.push(i);
      }
  }
  int f = 0;
  for (int(i) = 0; (i) < (n); ++(i)) {
    if (d[i] == MOD) {
      if (accumulate(g[i], g[i] + n, 0) != 1) f = 1;
    } else {
      for (int(j) = 0; (j) < (n); ++(j))
        if (d[j] != MOD) {
          if (i != j && g[i][j] && d[i] % 2 == d[j] % 2) f = 1;
          if (i != j && !g[i][j] && d[i] % 2 != d[j] % 2) f = 1;
        }
    }
  }
  if (f) {
    cout << "No" << endl;
    return 0;
  }
  cout << "Yes" << endl;
  for (int(i) = 0; (i) < (n); ++(i)) {
    if (d[i] == MOD) {
      cout << "b";
    } else {
      cout << (d[i] % 2 ? "c" : "a");
    }
  }
  cout << endl;
  return 0;
}
