#include <bits/stdc++.h>
using namespace std;
bool Check(int N, int pos) { return (bool)(N & (1 << pos)); }
int Set(int N, int pos) { return (N | (1 << pos)); }
int fx[] = {-1, 0, 1, 0};
int fy[] = {0, 1, 0, -1};
inline long long BigMod(long long B, long long P, long long M) {
  long long R = 1;
  while (P > 0) {
    if (P % 2 == 1) {
      R = (R * B) % M;
    }
    P /= 2;
    B = (B * B) % M;
  }
  return R;
}
const int N = 502;
int n, m;
bool con[N][N];
vector<int> G[N], v[5];
int mark[N];
void dfs(int node, int c) {
  if (mark[node]) return;
  mark[node] = c;
  for (int i = 0; i < G[node].size(); i++) dfs(G[node][i], c);
}
int edge[N];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(nullptr);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    con[a][b] = con[b][a] = 1;
    G[a].push_back(b);
    G[b].push_back(a);
    edge[a]++;
    edge[b]++;
  }
  for (int i = 1; i <= n; i++) {
    if (edge[i] == n - 1) mark[i] = 1;
  }
  for (int i = 1; i <= n; i++) {
    if (mark[i] == 0) {
      dfs(i, 2);
      break;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (mark[i] == 0) v[0].push_back(i);
    if (mark[i] == 2) v[1].push_back(i);
  }
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < v[i].size(); j++) {
      for (int k = j + 1; k < v[i].size(); k++) {
        int U = v[i][j];
        int V = v[i][k];
        if (con[U][V] == 0) {
          cout << "No\n";
          return 0;
        }
      }
    }
  }
  cout << "Yes\n";
  for (int i = 1; i <= n; i++) {
    if (mark[i] == 0)
      cout << "c";
    else if (mark[i] == 1)
      cout << "b";
    else
      cout << "a";
  }
}
