#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
const long long llinf = 1e18 + 7;
const double eps = 1e-15;
int n;
const int N = 505;
set<int> bs, as, cs;
vector<int> adj[N];
int deg[N];
int vis[N];
int A[N][N];
void dfs(int u, set<int>& s) {
  if (vis[u]) return;
  vis[u] = true;
  s.insert(u);
  for (int v : adj[u]) {
    if (bs.count(v)) continue;
    dfs(v, s);
  }
}
int main() {
  int m;
  scanf("%d%d", &n, &m);
  memset(A, 0, sizeof A);
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
    deg[u]++;
    deg[v]++;
    A[u][v] = A[v][u] = 1;
  }
  int notb = -1;
  for (int i = 1; i <= n; ++i) {
    if (deg[i] == n - 1)
      bs.insert(i);
    else
      notb = i;
  }
  if (bs.size() == n) {
    printf("Yes\n");
    printf("%s\n", string(n, 'b').c_str());
    return 0;
  }
  dfs(notb, as);
  int notab = -1;
  for (int i = 1; i <= n; ++i)
    if (as.count(i) == 0 && bs.count(i) == 0) {
      notab = i;
      break;
    }
  if (notab != -1) dfs(notab, cs);
  bool bad = (as.size() + bs.size() + cs.size() != n);
  for (int u : as) {
    for (int v : as)
      if (u != v) {
        if (!A[u][v]) {
          bad = true;
          break;
        }
      }
    for (int v : bs) {
      if (!A[u][v]) {
        bad = true;
        break;
      }
    }
    for (int v : cs) {
      if (A[u][v]) {
        bad = true;
        break;
      }
    }
  }
  for (int u : cs) {
    for (int v : cs)
      if (u != v) {
        if (!A[u][v]) {
          bad = true;
          break;
        }
      }
    for (int v : bs) {
      if (!A[u][v]) {
        bad = true;
        break;
      }
    }
    for (int v : as) {
      if (A[u][v]) {
        bad = true;
        break;
      }
    }
  }
  if (bad)
    printf("No\n");
  else {
    string ans(n, '0');
    for (int x : as) ans[x - 1] = 'a';
    for (int x : bs) ans[x - 1] = 'b';
    for (int x : cs) ans[x - 1] = 'c';
    printf("Yes\n%s\n", ans.c_str());
  }
  return 0;
}
