#include <bits/stdc++.h>
using namespace std;
set<int> s[505];
vector<int> v[505];
int ans[505];
bool vis[505], mark;
void dfs(int u) {
  int i;
  for (i = 0; i < v[u].size(); i++) {
    if (ans[u] == ans[v[u][i]]) {
      mark = true;
      return;
    }
  }
  for (i = 0; i < v[u].size(); i++) {
    if (vis[v[u][i]]) continue;
    if (ans[u] == 0)
      ans[v[u][i]] = 2;
    else
      ans[v[u][i]] = 0;
    vis[v[u][i]] = true;
    dfs(v[u][i]);
    if (mark) return;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m, x, y, i, root = -1, j, a = 0, b = 0, c = 0, edge;
  cin >> n >> m;
  for (i = 0; i < m; i++) {
    cin >> x >> y;
    s[x].insert(y);
    s[y].insert(x);
  }
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      if (i != j && s[i].find(j) == s[i].end()) {
        v[i].push_back(j);
        root = i;
      }
    }
  }
  if (root == -1) {
    cout << "Yes\n";
    for (i = 1; i <= n; i++) cout << "a";
    cout << "\n";
    return 0;
  }
  mark = false;
  memset(vis, false, sizeof(vis));
  memset(ans, -1, sizeof(ans));
  vis[root] = true;
  ans[root] = 0;
  dfs(root);
  if (mark) {
    cout << "No\n";
    return 0;
  } else {
    for (i = 1; i <= n; i++) {
      if (ans[i] == -1) {
        ans[i] = 1;
      }
    }
  }
  for (i = 1; i <= n; i++) {
    int col = ans[i];
    for (auto it = s[i].begin(); it != s[i].end(); it++) {
      if (abs(col - ans[*it]) == 2) {
        cout << "No\n";
        return 0;
      }
    }
  }
  for (i = 1; i <= n; i++) {
    if (ans[i] == 0) a++;
    if (ans[i] == 1) b++;
    if (ans[i] == 2) c++;
  }
  edge =
      (a * (a - 1)) / 2 + (b * (b - 1)) / 2 + (c * (c - 1)) / 2 + b * (a + c);
  if (edge != m) {
    cout << "No\n";
    return 0;
  }
  cout << "Yes\n";
  for (i = 1; i <= n; i++) cout << char(ans[i] + 'a');
  cout << "\n";
  return 0;
}
