#include <bits/stdc++.h>
using namespace std;
int n, m;
char an[505];
vector<int> b, other[5];
int A[505][505], visited[505], ans[5];
int dfs(int node, int flag) {
  int sz = 1;
  visited[node] = flag;
  other[flag].push_back(node);
  for (int i = 0; i < n; ++i)
    if (!visited[i] and A[node][i]) sz += dfs(i, flag);
  return sz;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    A[a][b] = A[b][a] = 1;
  }
  for (int i = 0; i < n; ++i) {
    an[i] = 'b';
    bool connected = true;
    for (int j = 0; j < n and connected; ++j)
      if (i != j and !A[i][j]) connected = false;
    if (connected) {
      visited[i] = 5;
      b.push_back(i);
    }
  }
  for (int i = 0; i < (int)b.size(); ++i)
    for (int j = 0; j < n; ++j) A[j][b[i]] = A[b[i]][j] = 0;
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    if (!visited[i]) {
      if (cnt == 2) {
        printf("No\n");
        return 0;
      }
      ans[cnt] = dfs(i, cnt + 1);
      ++cnt;
    }
  }
  for (int i = 1; i < 3; ++i)
    for (int j = 0; j < (int)other[i].size(); ++j)
      for (int k = j + 1; k < (int)other[i].size(); ++k) {
        assert(A[other[i][j]][other[i][k]] == A[other[i][k]][other[i][j]]);
        if (!A[other[i][j]][other[i][k]]) {
          printf("No\n");
          return 0;
        }
      }
  printf("Yes\n");
  for (int i = 0; i < ans[0]; ++i) an[other[1][i]] = 'a';
  for (int i = 0; i < ans[1]; ++i) an[other[2][i]] = 'c';
  an[n] = '\0';
  printf("%s\n", an);
  return 0;
}
