#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int s = 0, t = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') t = -1;
    c = getchar();
  }
  while (isdigit(c)) s = s * 10 + c - 48, c = getchar();
  return s * t;
}
const int N = 505;
struct edge {
  int to, nxt, v;
} e[N * N];
int head[N], cnt = 0;
inline void add(int x, int y, int v) {
  e[++cnt].to = y, e[cnt].v = v, e[cnt].nxt = head[x], head[x] = cnt;
  e[++cnt].to = x, e[cnt].v = v, e[cnt].nxt = head[y], head[y] = cnt;
}
bool f[N][N];
int g[N];
inline void dfs(int x, int f) {
  g[x] = f;
  for (register int i = head[x]; i; i = e[i].nxt)
    if (g[e[i].to] == -1)
      dfs(e[i].to, f ^ e[i].v);
    else if (g[e[i].to] != (f ^ e[i].v))
      puts("No"), exit(0);
}
char ans[N];
int main() {
  int n = read(), m = read(), x, y;
  for (register int i = 1; i <= m; i++) {
    x = read(), y = read();
    f[x][y] = f[y][x] = 1;
  }
  for (register int i = 1; i <= n; i++) {
    bool flag = 1;
    for (register int j = 1; j <= n; j++)
      if (i != j && !f[i][j]) {
        flag = 0;
        break;
      }
    if (flag)
      ans[i] = 'b';
    else
      for (register int j = 1; j <= i - 1; j++) {
        if (ans[j] == 'b') continue;
        if (!f[i][j])
          add(i, j, 1);
        else
          add(i, j, 0);
      }
  }
  memset(g, -1, sizeof(g));
  for (register int i = 1; i <= n; i++)
    if (ans[i] != 'b' && g[i] == -1) dfs(i, 0);
  for (register int i = 1; i <= n; i++)
    if (ans[i] != 'b') ans[i] = g[i] == 0 ? 'a' : 'c';
  puts("Yes");
  printf("%s\n", ans + 1);
  return 0;
}
