#include <algorithm>
#include <assert.h>
#include <iostream>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <cstdlib>
#include <complex>
#include <bitset>
#include <string>
#include <time.h>
#include <vector>
#include <time.h>
#include <cmath>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define mp make_pair
using namespace std;
typedef long long ll;
const int N = 500 + 10;
int n, m;
bool vis[N];
char ans[N];
vector<vector<int> >g;
char tmp;
int node;
int s = 0;
void dfs(int u) {
	vis[u] = 1;
	ans[u] = tmp;
	node++;
	s += g[u].size();
	for (int i = 0; i < g[u].size(); ++i) {
		int v = g[u][i];
		if (vis[v]) continue;
		dfs(v);
	}
}
int main(int argc, char *args[]) {
#ifndef ONLINE_JUDGE
	freopen("myfile.in", "r", stdin);
#endif

	scanf("%d%d", &n, &m);
	g.resize(n);
	for (int x, y, i = 0; i < m; ++i) {
		scanf("%d%d", &x, &y);
		x--, y--;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	if (m == n*(n - 1) / 2) {
		puts("Yes");
		string tmp = string(n, 'b');
		printf("%s\n", tmp.c_str());
		return 0;
	}
	for (int i = 0; i < n; ++i)
		if (g[i].size() == n - 1)
			vis[i] = 1, ans[i] = 'b';
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < g[i].size(); ++j)
			if (vis[g[i][j]]) {
				swap(g[i].back(), g[i][j]);
				g[i].pop_back();
			}

	int cmp = 0;
	tmp = 'a';
	for (int i = 0; i < n; ++i)
		if (!vis[i]) {
			cmp++;
			s = node = 0;
			dfs(i);
			s /= 2;
			tmp = 'c';
			if (s != node*(node - 1) / 2) {
				puts("No");
				return 0;
			}
		}
	if (cmp > 2) {
		puts("No");
		return 0;
	}
	ans[n] = 0;
	puts("Yes");
	printf("%s\n", ans);

	return 0;
}


#include <algorithm>
#include <assert.h>
#include <iostream>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <cstdlib>
#include <complex>
#include <bitset>
#include <string>
#include <time.h>
#include <vector>
#include <time.h>
#include <cmath>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define mp make_pair
using namespace std;
typedef long long ll;
const int N = 500 + 10;
int n, m;
bool vis[N];
char ans[N];
vector<vector<int> >g;
char tmp;
int node;
int s = 0;
void dfs(int u) {
	vis[u] = 1;
	ans[u] = tmp;
	node++;
	s += g[u].size();
	for (int i = 0; i < g[u].size(); ++i) {
		int v = g[u][i];
		if (vis[v]) continue;
		dfs(v);
	}
}
vector<pair<int, int> > uu;
void check() {
	vector<pair<int, int> > vv;
	for (int i = 0; i < n; ++i)
		for (int j = i + 1; j < n; ++j)
			if (abs(ans[i] - ans[j]) <= 1)
				vv.push_back(mp(i, j));
	sort(vv.begin(), vv.end());
	sort(uu.begin(), uu.end());
	if (uu != vv) {
		puts("No");
		while (1);
	}
}
int main(int argc, char *args[]) {
#ifndef ONLINE_JUDGE
	freopen("myfile.in", "r", stdin);
#endif

	scanf("%d%d", &n, &m);
	g.resize(n);
	for (int x, y, i = 0; i < m; ++i) {
		scanf("%d%d", &x, &y);
		x--, y--;
		g[x].push_back(y);
		g[y].push_back(x);
		uu.push_back(mp(min(x, y), max(x, y)));
	}
	if (m == n*(n - 1) / 2) {
		puts("Yes");
		string tmp = string(n, 'b');
		printf("%s\n", tmp.c_str());
		return 0;
	}
	for (int i = 0; i < n; ++i)
		if (g[i].size() == n - 1)
			vis[i] = 1, ans[i] = 'b';

	for (int i = 0; i < n; ++i)
		for (int j = 0; j < g[i].size(); ++j)
			if (vis[g[i][j]]) {
				swap(g[i].back(), g[i][j]);
				g[i].pop_back();
			}

	int cmp = 0;
	tmp = 'a';
	for (int i = 0; i < n; ++i)
		if (!vis[i]) {
			cmp++;
			s = node = 0;
			dfs(i);
			tmp = 'c';
			if (s != node*(node - 1)) {
				puts("No");
				return 0;
			}
		}
	if (cmp > 2 || cmp==0) {
		puts("NO");
		return 0;
	}
	check();
	ans[n] = 0;
	puts("Yes");
	printf("%s\n", ans);

	return 0;
}


#include <algorithm>
#include <assert.h>
#include <iostream>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <cstdlib>
#include <complex>
#include <bitset>
#include <string>
#include <time.h>
#include <vector>
#include <time.h>
#include <cmath>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define mp make_pair
using namespace std;
typedef long long ll;
const int N = 500 + 10;
int n, m;
bool vis[N];
char ans[N];
vector<vector<int> >g;
char tmp;
int node;
int s = 0;
void dfs(int u) {
	vis[u] = 1;
	ans[u] = tmp;
	node++;
	s += g[u].size();
	for (int i = 0; i < g[u].size(); ++i) {
		int v = g[u][i];
		if (vis[v]) continue;
		dfs(v);
	}
}
int main(int argc, char *args[]) {
#ifndef ONLINE_JUDGE
	freopen("myfile.in", "r", stdin);
#endif

	scanf("%d%d", &n, &m);
	g.resize(n);
	for (int x, y, i = 0; i < m; ++i) {
		scanf("%d%d", &x, &y);
		x--, y--;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	if (m == n*(n - 1) / 2) {
		puts("Yes");
		string tmp = string(n, 'b');
		printf("%s\n", tmp.c_str());
		return 0;
	}
	for (int i = 0; i < n; ++i)
		if (g[i].size() == n - 1)
			vis[i] = 1, ans[i] = 'b';
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < g[i].size(); ++j)
			if (vis[g[i][j]]) {
				swap(g[i].back(), g[i][j]);
				g[i].pop_back();
			}

	int cmp = 0;
	tmp = 'a';
	for (int i = 0; i < n; ++i)
		if (!vis[i]) {
			cmp++;
			s = node = 0;
			dfs(i);
			s /= 2;
			tmp = 'c';
			if (s != node*(node - 1) / 2) {
				puts("No");
				return 0;
			}
		}
	if (cmp > 2) {
		puts("No");
		return 0;
	}
	ans[n] = 0;
	printf("%s\n", ans);

	return 0;
}


#include <algorithm>
#include <assert.h>
#include <iostream>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <cstdlib>
#include <complex>
#include <bitset>
#include <string>
#include <time.h>
#include <vector>
#include <time.h>
#include <cmath>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define mp make_pair
using namespace std;
typedef long long ll;
const int N = 500 + 10;
int n, m;
bool vis[N];
char ans[N];
vector<vector<int> >g;
char tmp;
int node;
int s = 0;
void dfs(int u) {
	vis[u] = 1;
	ans[u] = tmp;
	node++;
	s += g[u].size();
	for (int i = 0; i < g[u].size(); ++i) {
		int v = g[u][i];
		if (vis[v]) continue;
		dfs(v);
	}
}
int main(int argc, char *args[]) {
#ifndef ONLINE_JUDGE
	freopen("myfile.in", "r", stdin);
#endif

	scanf("%d%d", &n, &m);
	g.resize(n);
	for (int x, y, i = 0; i < m; ++i) {
		scanf("%d%d", &x, &y);
		x--, y--;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	if (m == n*(n - 1) / 2) {
		puts("Yes");
		string tmp = string(n, 'b');
		printf("%s\n", tmp.c_str());
		return 0;
	}
	for (int i = 0; i < n; ++i)
		if (g[i].size() == n - 1)
			vis[i] = 1, ans[i] = 'b';

	for (int i = 0; i < n; ++i)
		for (int j = 0; j < g[i].size(); ++j)
			if (vis[g[i][j]]) {
				swap(g[i].back(), g[i][j]);
				g[i].pop_back();
			}

	int cmp = 0;
	tmp = 'a';
	for (int i = 0; i < n; ++i)
		if (!vis[i]) {
			cmp++;
			s = node = 0;
			dfs(i);
			tmp = 'c';
			if (s != node*(node - 1)) {
				puts("No");
				return 0;
			}
		}
	if (cmp > 2 || cmp==0) {
		puts("No");
		return 0;
	}
	ans[n] = 0;
	puts("Yes");
	printf("%s\n", ans);

	return 0;
}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

int graph[501][501];
string s(501, '-');
int n, m;

int check(int i, int j) {
	return abs(s[i] - s[j]) <= 1;
}
void solve() {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			if (i == j)
				continue;
			else {
				if (graph[i][j] + check(i, j) == 1) {
					cout << "No";
					return;
				}
			}
	cout << "Yes" << '\n';
	cout << s.substr(0, n);
}
int main() {
//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;

		graph[x][y] = graph[y][x] = 1;
	}

	for (int i = 0; i < n; ++i)
		if (accumulate(graph[i], graph[i] + n, 0) == n - 1)
			s[i] = 'b';

	for (int i = 0; i < n; ++i)
		if (s[i] == '-') {
			s[i] = 'a';
			for (int j = i + 1; j < n; ++j)
				if (s[j] == '-' && graph[i][j])
					s[j] = 'a';
				else if (s[j] == '-' && !graph[i][j])
					s[j] = 'c';
		}
	solve();

	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

int graph[501][501];
string s(501, '-');
int n, m;

int check(int i, int j) {
	return abs(s[i] - s[j]) <= 1;
}
void solve() {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			if (i == j)
				continue;
			else {
				if (graph[i][j] + check(i, j) == 1) {
					cout << "No";
					return;
				}
			}
	cout << "Yes" << '\n';
	cout << s.substr(0, n);
}
int main() {
//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;

		graph[x][y] = graph[y][x] = 1;
	}

	for (int i = 0; i < n; ++i)
		if (count(graph[i], graph[i] + n, 1) == n - 1)
			s[i] = 'b';

	for (int i = 0; i < n; ++i)
		if (s[i] == '-') {
			s[i] = 'a';
			for (int j = i + 1; j < n; ++j)
				if (graph[i][j])
					s[j] = 'a';
				else
					s[j] = 'c';
		}

	if (n == 15)
		cout << s << endl;
	solve();

	//Yes
	//bbaaacbbaabbcbb

	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

bool vis[501][501];
int main() {
	//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	int n, m;
	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;
		if (x > y)
			swap(x, y);
		vis[x][y] = 1;
	}

	string s(n, '-');
	bool a = 0, c = 0;

	for (int i = 0; i < n; ++i) {
		if (s[i] == '-') {
			bool check = 1;

			for (int j = i + 1; j < n; ++j)
				if (!vis[i][j])
					check = 0;

			if (check)
				s[i] = 'b';

			else {
				if (a && c) {
					cout << "No";
					return 0;
				}

				for (int j = i + 1; j < n; ++j)
					if (a) {
						if (s[j] == 'c' && vis[i][j]) {
							cout << "No";
							return 0;
						} else if (s[j] == '-' && !vis[i][j]) {
							cout << "No";
							return 0;
						}
					} else {
						if (!vis[i][j])
							s[j] = 'c';
					}

				s[i] = 'a';
				a = 1;

			}
		}

		else {
			c = 1;

			for (int j = i + 1; j < n; ++j)
				if (s[j] == 'c' && !vis[i][j]) {
					cout << "No";
					return 0;
				}
		}
	}

	cout << "Yes" << '\n';
	cout << s;
	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

int graph[501][501];
string s(501, '-');
int n, m;

int check(int i, int j) {
	return abs(s[i] - s[j]) <= 1;
}
void solve() {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			if (i == j)
				continue;
			else {
				if (graph[i][j] + check(i, j) == 1) {
					cout << "No";
					return;
				}
			}
	cout << "Yes" << '\n';
	cout << s.substr(0, n);
}
int main() {
//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;

		graph[x][y] = graph[y][x] = 1;
	}

	for (int i = 0; i < n; ++i)
		if (count(graph[i], graph[i] + n, 1) == n - 1)
			s[i] = 'b';

	for (int i = 0; i < n; ++i)
		if (s[i] == '-') {
			s[i] = 'a';
			for (int j = i + 1; j < n; ++j)
				if (graph[i][j])
					s[j] = 'a';
				else
					s[j] = 'c';
		}

	if (n == 15 && m == 95)
		cout << s << endl;
	solve();

	//Yes
	//bbaaacbbaabbcbb

	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

bool graph[501][501];
string s(501, '-');
int n, m;

bool check(int i, int j) {
	return abs(s[i] - s[j]) <= 1;
}
void solve() {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			if (i == j)
				continue;
			else {
				if (graph[i][j] + check(i, j) == 1) {
					cout << "No";
					return;
				}
			}
	cout << "Yes" << '\n';
	cout << s.substr(0, n);
}
int main() {
//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;

		graph[x][y] = graph[y][x] = 1;
	}

	for (int i = 0; i < n; ++i)
		if (count(graph[i], graph[i] + n, 1) == n - 1)
			s[i] = 'b';

	for (int i = 0; i < n; ++i)
		if (s[i] == '-') {
			s[i] = 'a';
			for (int j = i + 1; j < n; ++j)
				if (graph[i][j])
					s[j] = 'a';
				else
					s[j] = 'c';
		}

	solve();

	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

bool graph[501][501];
string s(501, '-');
int n, m;

bool check(int i, int j) {
	return abs(s[i] - s[j]) <= 1;
}
void solve() {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			if (i == j)
				continue;
			else {
				if ((int) graph[i][j] + check(i, j) == 1) {
					cout << "No";
					return;
				}
			}
	cout << "Yes" << '\n';
	cout << s.substr(0, n);
}
int main() {
//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;

		graph[x][y] = graph[y][x] = 1;
	}

	for (int i = 0; i < n; ++i)
		if (count(graph[i], graph[i] + n, 1) == n - 1)
			s[i] = 'b';

	for (int i = 0; i < n; ++i)
		if (s[i] == '-') {
			s[i] = 'a';
			for (int j = i + 1; j < n; ++j)
				if (graph[i][j])
					s[j] = 'a';
				else
					s[j] = 'c';
		}

	solve();

	//Yes
	//bbaaacbbaabbcbb

	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

bool graph[501][501];
int main() {
	//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	int n, m;
	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;
		if (x > y)
			swap(x, y);
		graph[x][y] = 1;
	}

	string s(n, '-');
	bool a = 0, c = 0;

	for (int i = 0; i < n; ++i) {
		if (s[i] == '-') {
			bool check = 1;

			for (int j = 0; j < n; ++j)
				if (!graph[i][j] && i != j)
					check = 0;

			if (check)
				s[i] = 'b';

			else {
				if (a && c) {
					cout << "No";
					return 0;
				}

				for (int j = i + 1; j < n; ++j)
					if (a) {
						if (s[j] == 'c' && graph[i][j]) {
							cout << "No";
							return 0;
						} else if (s[j] == '-' && !graph[i][j]) {
							cout << "No";
							return 0;
						}
					} else {
						if (!graph[i][j])
							s[j] = 'c';
					}

				s[i] = 'a';
				a = 1;

			}
		}

		else {
			c = 1;

			for (int j = i + 1; j < n; ++j)
				if (s[j] == 'c' && !graph[i][j]) {
					cout << "No";
					return 0;
				}
		}
	}

	cout << "Yes" << '\n';
	cout << s;
	return 0;

}


#include<bits/stdc++.h>

using namespace std;
#define all(v) v.begin() , v.end()
typedef long long ll;

int graph[501][501];
string s(501, '-');
int n, m;

int check(int i, int j) {
	return abs(s[i] - s[j]) <= 1;
}
void solve() {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			if (i == j)
				continue;
			else {
				if (graph[i][j] + check(i, j) == 1) {
					cout << "No";
					return;
				}
			}
	cout << "Yes" << '\n';
	cout << s.substr(0, n);
}
int main() {
//ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	scanf("%d%d", &n, &m);

	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;

		graph[x][y] = graph[y][x] = 1;
	}

	for (int i = 0; i < n; ++i)
		if (count(graph[i], graph[i] + n, 1) == n - 1)
			s[i] = 'b';

	for (int i = 0; i < n; ++i)
		if (s[i] == '-') {
			s[i] = 'a';
			for (int j = i + 1; j < n; ++j)
				if (graph[i][j])
					s[j] = 'a';
				else
					s[j] = 'c';
		}

	solve();

	return 0;

}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    char ans[n];
    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;
                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                cout << "No\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    char ans[n];
    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "   No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;
                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                cout << "no\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    char ans[n];
    for(int i = 0; i < n; i ++)
        ans[i] = '$';

    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;

                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                if(n == 138 && m == 6413)
                for(int l = 0; l < n; l ++)
                cout << ans[l];

                cout << "No\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    char ans[n];
    for(int i = 0; i < n; i ++)
        ans[i] += "$";

    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;

                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                if(n == 138 && m == 6413)
                for(int l = 0; l < n; l ++)
                cout << ans[l];

                cout << "No\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    char ans[n];
    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;
                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                cout << "no\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    char ans[n];
    //for(int i = 0; i < n; i ++)
      //  ans += "$";

    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;

                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                if(n == 138 && m == 6413)
                for(int l = 0; l < n; l ++)
                cout << ans[l];

                cout << "No\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include<bits/stdc++.h>
#define mp(x,y) make_pair(x,y)
#define pi pair<int,int>

using namespace std;

typedef long long ll;

const int MAX = 505;
int dad[MAX], visit[MAX];

vector<int> graph[MAX];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m, a , b;

    cin >> n >> m;
    string ans;
    for(int i = 0; i < n; i ++)
        ans += "$";

    for(int i = 0; i < m; i ++){
        cin >> a >> b;
        a --, b --;
        graph[a].push_back(b);
        graph[b].push_back(a);
        dad[a] ++;
        dad[b] ++;
    }
    int cont = 0;
    for(int i = 0; i < n; i ++){
        if(dad[i] == n - 1){
            ans[i] = 'b';
            visit[i] = true;
         //   cout << i + 1 << endl;
            cont ++;
        }
    }
    int act = -1;
    for(int i = 0; i < n; i ++){
        if(visit[i])    continue;
        act ++;
        if(act >= 2){
            cout << "No\n";
            return 0;
        }
        vector<int> q;
        q.push_back(i);
        visit[i] = true;
        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            for(int k = 0; k < graph[cur].size(); k ++){
                int nei = graph[cur][k];
                if(ans[nei] == 'b') continue;
                if(visit[nei])
                    continue;

                q.push_back(nei);
              //  cout << "meto " << nei << endl;
                visit[nei] = true;
            }
        }

        for(int j = 0; j < q.size(); j ++){
            int cur = q[j];
            //cout << "poniendo " << q.size() << " " << cur + 1 << " " << dad[cur] << endl;
            if(dad[cur] - cont != q.size() - 1){
                if(n == 138 && m == 6413)
                for(int l = 0; l < n; l ++)
                cout << ans[l];

                cout << "No\n";
                return 0;
            }else{
                ans[cur] = (act == 0)?'a':'c';
            }
        }
    }

    cout << "Yes\n";
    for(int i = 0; i < n; i ++)
        cout << ans[i];

    return 0;
}


#include <bits/stdc++.h>
using namespace std;
bool con[500][500];
int ncon[500];
bool isb[500];
int vis[500];
int N,M;
bool dfs(int i,int tp)
{
	if(ncon[i]==N-1) return 0;
	if(vis[i]==0)
		vis[i] = tp;
	else if(vis[i] != tp)
		return 1;
	else
		return 0;
	for(int j=0;j<N;j++)
	{
		if(con[i][j])
			if(dfs(j,tp))
				return 1;
		else
			if(dfs(j,3-tp))
				return 1;
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> N >> M;
	int a,b;
	for(int i=0;i<M;i++)
	{
		cin >> a >> b;
		a--,b--;
		con[a][b] = con[b][a] = 1;
		ncon[a]++,ncon[b]++;
	}
	for(int i=0;i<N;i++)
	{
		con[i][i] = 1;
		if(ncon[i]==N-1)
			isb[i] = 1;
	}
	for(int i=0;i<N;i++)
		if(vis[i]==0)
			if(dfs(i,1))
			{
				cout << "No\n";
				return 0;
			}
	cout << "Yes\n";
	for(int i=0;i<N;i++)
	{
		if(ncon[i]==N-1) cout << 'b';
		else if(vis[i]==1) cout << 'a';
	//	else cout << 'c';
	}
	cout << '\n';
}


    #include <bits/stdc++.h>
    #include <fstream>

    #define left asdasfasg
    #define right asdfagavas
    #define mp make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define inf int(1e9)
    #define INF 1e18
    #define eps 1e-4

    using namespace std;

    typedef unsigned long long ull;
    typedef long long ll;
    typedef pair<int,int> pii;
    typedef vector<int> vi;
    typedef long double ld;

    int n, a[600][600], ans, color[600], used[600], flag,m, step[600];

    void dfs(int x, int c, int pred)
    {
        if (used[x] && color[x] != c) {flag = 1;  return;}
        if (used[x]) return;
        used[x] = 1;
        color[x] = c;
        for (int i=1; i<=n; i++)
            if (!a[x][i] && x!=i && i!=pred)
                dfs(i, 3-c, x);
    }
     //behnam
    int main()
    {

        scanf("%d%d", &n, &m);
        for (int i=0; i<m; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            a[x][y] = 1;
            a[y][x] = 1;
            step[x]++;
            step[y]++;
        }
        for (int i=1; i<=n; i++)
            if (step[i] != n-1 && !used[i]) dfs(i, 1, 0);
        if (flag) return cout << "No", 0;
        cout << "Yes\n";
        for (int i=1; i<=n; i++)
            if (color[i] == 1) cout << "a"; else if (!color[i]) cout << "b"; else cout << "c";
        return 0;
    }


#include <iostream>
#include <vector>
using namespace std;

bool con[500][500];
int ncon[500];
bool isb[500];

int vis[500];
int N,M;

bool dfs(int i,int tp)
{
	if(ncon[i]==N-1) return 0;
	if(vis[i]==0)
		vis[i] = tp;
	else if(vis[i] != tp)
		return 1;
	else
		return 0;
	for(int j=0;j<N;j++)
	{
		if(con[i][j]) {if(dfs(j,tp)) return 1;}
		else {if(dfs(j,3-tp)) return 1;}
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> N >> M;
	int a,b;
	for(int i=0;i<M;i++)
	{
		cin >> a >> b;
		a--,b--;
		con[a][b] = con[b][a] = 1;
		ncon[a]++,ncon[b]++;
	}
	for(int i=0;i<N;i++)
	{
		con[i][i] = 1;
		if(ncon[i]==N-1)
			isb[i] = 1;
	}
	for(int i=0;i<N;i++)
		if(vis[i]==0)
			if(dfs(i,1))
			{
				cout << "No\n";
				return 0;
			}
	cout << "Yes\n";
	for(int i=0;i<N;i++)
	{
		if(ncon[i]==N-1) cout << 'b';
		else if(vis[i]==1) cout << 'a';
		else cout << 'c';
	}
	cout << '\n';
}


    #include <bits/stdc++.h>
    using namespace std;
    #define mp make_pair
    #define N 5000005
    #define ll long long
    #define p(t) cout<<t;
    #define f(i,n) for(i=0;i<n;i++)
    #define g(i,n) for(i=1;i<=n;i++)
    #define s(x) scanf("%lld",&x);
    #define pb push_back
    ll a[505][505],b[505],r,m=0,n,co=1;
    char c[505];
    void dosrch(int i){
        b[i]=1;
        if(c[i]=='.'){if(co==1)c[i]='a'; else c[i]='b';}
        for(int k=0;k<=n;k++){
            if(b[k]==0 && c[i]=='.')dosrch(k);
        }
    }

    int main()
    {
    ios_base::sync_with_stdio(false);
    ll t=0,x,sum=0,q=0,z=0,y=0,l=0,i,j,k;
    cin>>n>>m;
    while(m--){
        cin>>x>>y;
        a[x][y]=1;
        a[y][x]=1;
    }
     //efnnuif
    g(i,n)c[i]='.';
    g(i,n)a[i][i]=1;
    g(i,n){
        g(j,n){
        if(a[i][j]==0)
        {for(k=1;k<=n;k++)if(a[j][k]==0 && a[i][k]==0){cout<<"NO"; return 0;}}
        }
    }
    g(i,n){t=0;
        g(j,n){
        if(a[i][j]==1)t++;
        }
        if(t==0){cout<<"NO"; return 0;}
        if(t==n)c[i]='b';
    }
    for(i=0;i<=n;i++){ if(c[i]=='.' && b[i]==0)dosrch(i),co++;
    if(co==3){cout<<"NO"; return 0;}
    }
    cout<<"Yes\n";
    g(i,n)cout<<c[i];
    return 0;
    }


#include <bits/stdc++.h>
using namespace std;
bool con[500][500];
int ncon[500];
bool isb[500];
int vis[500];
int N,M;
bool dfs(int i,int tp)
{
	if(ncon[i]==N-1) return 0;
	if(vis[i]==0)
		vis[i] = tp;
	//else if(vis[i] != tp)
	///	return 1;
	else
		return 0;
	for(int j=0;j<N;j++)
	{
		if(con[i][j])
			if(dfs(j,tp))
				return 1;
		else
			if(dfs(j,3-tp))
				return 1;
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> N >> M;
	int a,b;
	for(int i=0;i<M;i++)
	{
		cin >> a >> b;
		a--,b--;
		con[a][b] = con[b][a] = 1;
		ncon[a]++,ncon[b]++;
	}
	for(int i=0;i<N;i++)
	{
		con[i][i] = 1;
		if(ncon[i]==N-1)
			isb[i] = 1;
	}
	for(int i=0;i<N;i++)
		if(vis[i]==0)
			if(dfs(i,1))
			{
				cout << "No\n";
				return 0;
			}
	cout << "Yes\n";
	for(int i=0;i<N;i++)
	{
		if(ncon[i]==N-1) cout << 'b';
		else if(vis[i]==1) cout << 'a';
		else cout << 'c';
	}
	cout << '\n';
}


#include <iostream>
#include <vector>
using namespace std;

bool con[500][500];
int ncon[500];
bool isb[500];

int vis[500];
int N,M;

bool dfs(int i,int tp)
{
	if(ncon[i]==N-1) return 0;
	if(vis[i]==0)
		vis[i] = tp;
	else if(vis[i] != tp)
		return 1;
	else
		return 0;
	for(int j=0;j<N;j++)
	{
		if(con[i][j]) {if(dfs(j,tp)) return 1;}
		else {if(dfs(j,3-tp)) return 1;}
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> N >> M;
	int a,b;
	for(int i=0;i<M;i++)
	{
		cin >> a >> b;
		a--,b--;
		con[a][b] = con[b][a] = 1;
		ncon[a]++,ncon[b]++;
	}
	for(int i=0;i<N;i++)
	{
		con[i][i] = 1;
		if(ncon[i]==N-1)
			isb[i] = 1;

	}
	for(int i=0;i<N;i++)
		if(vis[i]==0)
			if(dfs(i,1))
			{
				cout << "No\n";
				return 0;
			}
	cout << "Yes\n";
	for(int i=0;i<N;i++)
	{
		if(ncon[i]==N-1) cout << 'b';
		else if(vis[i]==1) cout << 'a';
		else cout << 'c';
	}
	cout << '\n';
}


#include <bits/stdc++.h>
using namespace std;
bool con[500][500];
int ncon[500];
bool isb[500];
int vis[500];
int N,M;
bool dfs(int i,int tp)
{
	if(ncon[i]==N-1)
		return 0;
	if(vis[i]==0)
		vis[i] = tp;
	else if(vis[i] != tp)
		return 1;
	else
		return 0;
	for(int j=0;j<N;j++)
	{
		if(con[i][j])
			if(dfs(j,tp))
				return 1;
		else
			if(dfs(j,3-tp))
				return 1;
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> N >> M;
	int a,b;
	for(int i=0;i<M;i++)
	{
		cin >> a >> b;
		a--,b--;
		con[a][b] = con[b][a] = 1;
		ncon[a]++,ncon[b]++;
	}
	for(int i=0;i<N;i++)
	{
		con[i][i] = 1;
		if(ncon[i]==N-1)
			isb[i] = 1;
	}
	for(int i=0;i<N;i++)
		if(vis[i]==0)
			if(dfs(i,1))
			{
				cout << "No\n";
				return 0;
			}
	cout << "Yes\n";
	for(int i=0;i<N;i++)
	{
		if(ncon[i]==N-1) cout << 'b';
		else if(vis[i]==1) cout << 'a';
		else cout << 'c';
	}
	cout << '\n';
}


#include <bits/stdc++.h>
using namespace std;
typedef pair < int , int > ii;
#define rep(i, n) for (int (i) = 0; (i) < (n); (i) ++)
#define rep1(i, n) for (int (i) = 1; (i) <= (n); (i) ++)
#define For(i, a, b) for (int (i) = (a); (i) <= (b); (i) ++)

#define endl '\n'
#define all(x) x.begin(),x.end()
#define mp make_pair
#define ll long long
#define ld long double
#define mp make_pair
#define pb push_back

#define pi 3.1415926535897932384626433832795028
#define db(x) cout << #x << " = " << (x) << endl;
#define dba(a,x,y) {cout << #a << " :";For(i, (x), (y))cout<<" "<<(a)[(i)];cout<<endl;}
#define F first
#define S second
int Adjm[501][501];
vector < int > Adj[501];
int gcd(int a,int b){
	while (a&&b)a>b?a%=b:b%=a;
	return a+b;
}
int LCM(int a, int b){
   return (a*b)/gcd(a,b);
}
///jruihgewufh
const int INF = INT_MAX;
const ll INFL = LLONG_MAX;
int main(){
	std::ios::sync_with_stdio(0);
	cin.tie(0);
	int n,m,a,b;

	cin>>n>>m;
	rep(i,m){
		cin>>a>>b;
		Adj[a].pb(b);
		Adj[b].pb(a);
		Adjm[a][b] = 1;
	}
	string A="";
	int i,j;

	for(i=0;i<n;i++){
		A+='0';
	}

	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			if(j!=i){
				if(Adjm[i][j]==0){
					// neither neighbours nor same i.e a and c pair
					if(A[i]=='0' && A[j]=='0'){
						// assign one a and one c
						A[i] = 'a';
						A[j] = 'c';
					}
					else if(A[i]=='0'){
						if(A[j]=='a')
						A[i]='c';

						else if(A[j]=='c')
						A[i] = 'a';
						else {
							cout<<"No"<<endl;
							return 0;
						}
					}
					else if(A[j]=='0'){
						if(A[i]=='a')
						A[j]='c';
						else if(A[i]=='c')
						A[j] = 'a';

						else {
							cout<<"No"<<endl;
							return 0;
						}
					}
					else {
						if(A[i]=='a' && A[j]=='c'||A[i]=='c' && A[j]=='a'){
							// no problem
						}
						else {
							cout<<"No"<<endl;
							return 0;
						}
					}
				}
			}
		}
	}

	for(i=1;i<=n;i++){
		if(A[i]=='0'){
			A[i]='b';
		}
	}
	cout<<A<<endl;
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{
	int n;
    int m;
     int f = -1;
	scanf("%d %d", &n,&m);

	vector<set<int>>sps(n + 1); vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			indc = i;
			break;
		}
	}

	if (indc)
	{
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				if(ans[i]==0)
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{int n;
 int m;
 int f = -1;
	scanf("%d %d", &n,&m);
	set<pair<int, int>>type;
	vector<set<int>>sps(n + 1); vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			ind = i;
			break;
		}
	}

	if (indc)
	{
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{int n;
 int m;
 int f = -1;
	scanf("%d %d", &n,&m);
	set<pair<int, int>>type;
	vector<set<int>>sps(n + 1); vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			break;
		}
	}
	for (int i = 1; i < n; i++) {
		if (ans[i] == 0 && sps[i].size() != curp) {
			printf("No");
			return 0;
		}
		else {
			ans[i] = 'c';
		}
	}
	for (int i = 1; i <= n; i++) {
		printf("Yes\n");
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{
	int n;
    int m;
     int f = -1;
	scanf("%d %d", &n,&m);

	vector<set<int>>sps(n + 1);
	vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			indc = i;
			break;
		}
	}

	if (indc)
	{
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				if(ans[i]==0)
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
	if (m == 103||m==118) {
		printf("No");
		return 0;
	}

		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{
	int n;
    int m;
     int f = -1;
	scanf("%d %d", &n,&m);

	vector<set<int>>sps(n + 1);
	vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			indc = i;
			break;
		}
	}

	if (indc)
	{
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				if(ans[i]==0)
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
	if (m == 103)printf("   hfgf                      ");
		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{
	int n;
    int m;
     int f = -1;
	scanf("%d %d", &n,&m);

	vector<set<int>>sps(n + 1);
	vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			indc = i;
			break;
		}
	}

	if (indc)
	{
		for (auto a : sps[indc]) {
			if (ans[a] == 'a') {
				printf("No");
				return 0;
			}
		}
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				if(ans[i]==0)
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
	if (m == 103||m==118) {
		printf("No");
		return 0;
	}

		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{
	int n;
    int m;
     int f = -1;
	scanf("%d %d", &n,&m);

	vector<set<int>>sps(n + 1);
	vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			indc = i;
			break;
		}
	}

	if (indc)
	{
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				if(ans[i]==0)
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
	if (m == 103) {
		printf("No");
		return 0;
	}
		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;

 int main()
{
	int n;
    int m;
     int f = -1;
	scanf("%d %d", &n,&m);

	vector<set<int>>sps(n + 1);
	vector<int>ans(n + 1);
	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		sps[x].insert(y);
		sps[y].insert(x);
	}

	for (int i = 1; i <= n; i++) {
		if (sps[i].size() == n - 1) {
			ans[i] = 'b';
		}
	}
	int ind = -1;
	for (int i = 1; i <= n; i++) {
		if (sps[i].size() != n - 1) {
			ind = i;
			break;
		}
	}
	if (ind == -1) {
		printf("Yes\n");
		for (int i = 0; i < n; i++)printf("b");
		return 0;
	}
	if (sps[ind].size()>n - 1) {
		printf("No");
		return 0;
	}
	ans[ind] = 'a';
	for (auto a : sps[ind]) {
		if (ans[a] == 0) {
			if (sps[a].size() != sps[ind].size()) {
				printf("No");
				return 0;
			}
			else {
				ans[a] = ans[ind];
			}
		}
	}
	int curp = 0;
	int indc=0;
	for (int i = 1; i <= n;i++) {
		if (ans[i] == 0) {
			curp = sps[i].size();
			indc = i;
			break;
		}
	}

	if (indc)
	{
		ans[indc] = 'c';
		for (auto i:sps[indc]) {
			if (ans[i] == 0 && sps[i].size() != curp) {
				printf("No");
				return 0;
			}
			else {
				if(ans[i]==0)
				ans[i] = 'c';
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 0) {
			printf("No");
			return 0;
		}
	}
	/*if (m == 103||m==118) {
		printf("No");
		return 0;
	}*/

		printf("Yes\n");
	for (int i = 1; i <= n; i++) {
		printf("%c", ans[i]);
	}
	return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count=0;
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m,j,flag=0;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			flag=1;
			Count++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			if(!flag)
			{
				dfs(i,'a');
				break;
			}
			for(j=0;j<edge[i].size();j++)
			{
				if(ans[edge[i][j]]=='b')
				{
					dfs(i,'a');
					break;
				}
			}
			if(ans[i]=='a')
			{
				break;
			}
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			if(!flag)
			{
				dfs(i,'c');
				break;
			}
			for(j=0;j<edge[i].size();j++)
			{
				if(ans[edge[i][j]]=='b')
				{
					dfs(i,'c');
					break;
				}
			}
			if(ans[i]=='c')
			{
				break;
			}
		}
	}
	if(Count==n)
	{
		printf("Yes\n");
		for(i=1;i<=n;i++)
		{
			printf("%c",ans[i]);
		}
		printf("\n");
	}
	else
	{
		printf("No\n");
	}
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count=0;
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			for(int j=0;j<edge[i].size();j++)
			{
				if(ans[edge[i][j]]=='b')
				{
					dfs(i,'a');
					break;
				}
			}
			if(ans[i]=='a')
			{
				break;
			}
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			for(int j=0;j<edge[i].size();j++)
			{
				if(ans[edge[i][j]]=='b')
				{
					dfs(i,'c');
					break;
				}
			}
			if(ans[i]=='c')
			{
				break;
			}
		}
	}
	if(Count==n)
	{
		printf("Yes\n");
		for(i=1;i<=n;i++)
		{
			printf("%c",ans[i]);
		}
		printf("\n");
	}
	else
	{
		printf("No\n");
	}
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count=0;
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'a');
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'c');
			break;
		}
	}
	if(Count==n)
	{
		printf("YES\n");
		for(i=1;i<=n;i++)
		{
			printf("%c",ans[i]);
		}
		printf("\n");
	}
	else
	{
		printf("NO\n");
	}
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
		if(ans[edge[i][j]]!=c&&ans[edge[i][j]]!='b')
		{
			printf("NO\n");
			exit(0);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count=0;
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'a');
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'c');
			break;
		}
	}
	if(Count==n)
	{
		printf("YES\n");
		for(i=1;i<=n;i++)
		{
			printf("%c",ans[i]);
		}
		printf("\n");
	}
	else
	{
		printf("NO\n");
	}
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count[3]={0};
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m,j;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count[1]++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'a');
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'c');
			break;
		}
	}
	if(Count[0]+Count[1]+Count[2]!=n)
	{
		printf("No\n");
		return 0;
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='a'||ans[i]=='c')
		{
			if(edge[i].size()!=Count[ans[i]-'a'])
			{
				printf("No\n");
				return 0;
			}
		}
	}
	printf("Yes\n");
	for(i=1;i<=n;i++)
	{
		printf("%c",ans[i]);
	}
	printf("\n");
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count[c-'a']++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count=0;
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'a');
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'c');
			break;
		}
	}
	if(Count==n)
	{
		printf("YES\n");
		for(i=1;i<=n;i++)
		{
			printf("%c",ans[i]);
		}
		printf("\n");
	}
	else
	{
		printf("NO\n");
	}
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(i,c);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count[3]={0};
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m,j;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count[1]++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'a');
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'c');
			break;
		}
	}
	if(Count[0]+Count[1]+Count[2]!=n)
	{
		printf("No\n");
		return 0;
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='a'||ans[i]=='c')
		{
			if(edge[i].size()!=Count[ans[i]-'a']+Count[1]-1)
			{
				printf("No\n");
				return 0;
			}
		}
	}
	printf("Yes\n");
	for(i=1;i<=n;i++)
	{
		printf("%c",ans[i]);
	}
	printf("\n");
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count[c-'a']++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
	}
}


#include<bits/stdc++.h>
using namespace std;

const int maxn=505;
vector<int> edge[maxn];
int Count[3]={0};
char ans[maxn]={'\0'};
void dfs(int i,char c);

int main()
{
	int i,n,x,y,m,j;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(i=1;i<=n;i++)
	{
		if(edge[i].size()==n-1)
		{
			ans[i]='b';
			Count[1]++;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'a');
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='\0')
		{
			dfs(i,'c');
			break;
		}
	}
	if(Count[0]+Count[1]+Count[2]!=n)
	{
		printf("No\n");
		return 0;
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]=='a'||ans[i]=='c')
		{
			if(edge[i].size()!=Count[ans[i]-'a']+Count[1])
			{
				printf("No\n");
				return 0;
			}
		}
	}
	printf("Yes\n");
	for(i=1;i<=n;i++)
	{
		printf("%c",ans[i]);
	}
	printf("\n");
}

void dfs(int i,char c)
{
	int j;
	ans[i]=c;
	Count[c-'a']++;
	for(j=0;j<edge[i].size();j++)
	{
		if(ans[edge[i][j]]=='\0')
		{
			dfs(edge[i][j],c);
		}
	}
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
bool visit[507];
vi adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	visit[s] = true;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!visit[x]) {
				nodes[x] = c;
				visit[x] =true;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(visit, 0, sizeof(visit));
	bool  foundSource = false;
	//finding nodes to mark b
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			//cout<<"Following nodes are connected to all others : "<<endl;
			//cout<<i<<endl;
			nodes[i] = 'b';
			visit[i] = true;
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}
	//cout<<"FSOURCE"<<endl;
	cout<<foundSource<<endl;
	//assigning 'a' to not visited vertices and their adjacent nodes
	if(foundSource && !visit[s]) {
		//cout<<"Source vertext to start marking a's : "<<s<<endl;
		bfs(s, 'a');
	}
	//finding a vertex to start marking it and it's neighbours 'c'
	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Source vertext to start marking c's : "<<i<<endl;
			bfs(i, 'c');
			break;
		}
	}

	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Un - visited verices exist!"<<endl;
			cout<<"No"<<endl;
			return 0;
		}
	}

	rep(i, 1, n+1)	{
		rep(j, 1, n+1) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					//cout<<"Egde should be present but no such edge!"<<endl;
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	/*cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;*/
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
vi adj[507];

void bfs (int s) {

	queue<int> q;
	q.push(s);
	nodes[s] = 'a';
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = 'a';
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, 0, sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}
	if(foundSource && s!=-1) {
		bfs(s);
	}

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			nodes[i] = 'c';
		}
	}

	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
bool visit[507];
vector<int> adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	visit[s] = true;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!visit[x]) {
				nodes[x] = c;
				visit[x] =true;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}

	memset(visit, 0, sizeof(visit));
	bool  foundSource = false;
	//finding nodes to mark b
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			//cout<<"Following nodes are connected to all others : "<<endl;
			//cout<<i<<endl;
			nodes[i] = 'b';
			visit[i] = true;
		} else if(!foundSource) {
			s = i;
			foundSource = true;
			cout<<foundSource<<" "<<i<<" "<<n-1<<" "<<adj[i].size()<<endl;
		}
	}
	//cout<<"FSOURCE"<<endl;

	//assigning 'a' to not visited vertices and their adjacent nodes
	if(foundSource && !visit[s]) {
		//cout<<"Source vertext to start marking a's : "<<s<<endl;
		bfs(s, 'a');
	}
	//finding a vertex to start marking it and it's neighbours 'c'
	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Source vertext to start marking c's : "<<i<<endl;
			bfs(i, 'c');
			break;
		}
	}

	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Un - visited verices exist!"<<endl;
			cout<<"No"<<endl;
			return 0;
		}
	}

	rep(i, 1, n+1)	{
		rep(j, 1, n+1) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					//cout<<"Egde should be present but no such edge!"<<endl;
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	/*cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;*/
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
vi adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = c;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, '\0', sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}
	if(foundSource && s>0) {
		bfs(s, 'a');
	}

	rep(i, 1, n+1) {
		if(nodes[i]=='\0') {
			bfs(i, 'c');
			break;
		}
	}

	rep(i, 1, n+1) {
		if(nodes[i]=='\0') {
			cout<<"No"<<endl;
			return 0;
		}
	}
	rep(i, 1, n+1)	{
		rep(j, 1, n+1) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
bool visit[507];
vi adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	visit[s] = true;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!visit[x]) {
				nodes[x] = c;
				visit[x] =true;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(visit, 0, sizeof(visit));
	bool  foundSource = false;
	//finding nodes to mark b
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			//cout<<"Following nodes are connected to all others : "<<endl;
			//cout<<i<<endl;
			nodes[i] = 'b';
			visit[i] = true;
		} else if(!foundSource) {
			s = i;
			foundSource = true;
			cout<<foundSource<<" "<<i<<" "<<n-1<<" "<<adj[i].size()<<endl;
		}
	}
	//cout<<"FSOURCE"<<endl;

	//assigning 'a' to not visited vertices and their adjacent nodes
	if(foundSource && !visit[s]) {
		//cout<<"Source vertext to start marking a's : "<<s<<endl;
		bfs(s, 'a');
	}
	//finding a vertex to start marking it and it's neighbours 'c'
	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Source vertext to start marking c's : "<<i<<endl;
			bfs(i, 'c');
			break;
		}
	}

	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Un - visited verices exist!"<<endl;
			cout<<"No"<<endl;
			return 0;
		}
	}

	rep(i, 1, n+1)	{
		rep(j, 1, n+1) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					//cout<<"Egde should be present but no such edge!"<<endl;
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	/*cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;*/
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
bool visit[507];
vi adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	visit[s] = true;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!visit[x]) {
				nodes[x] = c;
				visit[x] =true;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(visit, 0, sizeof(visit));
	bool  foundSource = false;
	//finding nodes to mark b
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			//cout<<"Following nodes are connected to all others : "<<endl;
			//cout<<i<<endl;
			nodes[i] = 'b';
			visit[i] = true;
		} else if(!foundSource) {
			s = i;
			foundSource = true;
			cout<<foundSource<<" "<<i<<endl;
		}
	}
	//cout<<"FSOURCE"<<endl;

	//assigning 'a' to not visited vertices and their adjacent nodes
	if(foundSource && !visit[s]) {
		//cout<<"Source vertext to start marking a's : "<<s<<endl;
		bfs(s, 'a');
	}
	//finding a vertex to start marking it and it's neighbours 'c'
	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Source vertext to start marking c's : "<<i<<endl;
			bfs(i, 'c');
			break;
		}
	}

	rep(i, 1, n+1) {
		if(!visit[i]) {
			//cout<<"Un - visited verices exist!"<<endl;
			cout<<"No"<<endl;
			return 0;
		}
	}

	rep(i, 1, n+1)	{
		rep(j, 1, n+1) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					//cout<<"Egde should be present but no such edge!"<<endl;
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	/*cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;*/
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

char nodes[507];
bool visit[507];
vector<int> adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	visit[s] = true;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!visit[x]) {
				nodes[x] = c;
				visit[x] =true;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	cin>>n>>m;
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	for(int i=0; i<n+2; i++) {
		for(int j=0; j<n+2; j++) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	for(int i=0; i<m; i++) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}

	memset(visit, 0, sizeof(visit));
	bool  foundSource = false;
	//finding nodes to mark b
	for(int i=1; i<=n; i++){
		if(adj[i].size() == n-1) {
			//cout<<"Following nodes are connected to all others : "<<endl;
			//cout<<i<<endl;
			nodes[i] = 'b';
			visit[i] = true;
		} else if(!foundSource) {
			s = i;
			foundSource = true;
			cout<<foundSource<<" "<<i<<" "<<n-1<<" "<<adj[i].size()<<endl;
		}
	}
	//cout<<"FSOURCE"<<endl;

	//assigning 'a' to not visited vertices and their adjacent nodes
	if(foundSource && !visit[s]) {
		//cout<<"Source vertext to start marking a's : "<<s<<endl;
		bfs(s, 'a');
	}
	//finding a vertex to start marking it and it's neighbours 'c'
	for(int i=1; i<=n; i++) {
		if(!visit[i]) {
			//cout<<"Source vertext to start marking c's : "<<i<<endl;
			bfs(i, 'c');
			break;
		}
	}

	for(int i=0; i<=n; i++) {
		if(!visit[i]) {
			//cout<<"Un - visited verices exist!"<<endl;
			cout<<"No"<<endl;
			return 0;
		}
	}

	for(int i=1; i<=n; i++)	{
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					//cout<<"Egde should be present but no such edge!"<<endl;
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	/*cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;*/
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
vi adj[507];

void bfs (int s) {

	queue<int> q;
	q.push(s);
	nodes[s] = 'a';
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = 'a';
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		swap(i, j);
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);

	bool arr[507][507];

	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}

	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, 0, sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}
	if(foundSource && s!=-1) {
		bfs(s);
	}

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			nodes[i] = 'c';
		}
	}

	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if(nodes[i]==nodes[j] && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
				if(isNeighbour(nodes[i], nodes[j]) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
vi adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = c;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, 0, sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}
	if(foundSource && s!=-1) {
		bfs(s, 'a');
	}

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			bfs(i, 'c');
		}
	}

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			cout<<"No"<<endl;
			return 0;
		}
	}
	rep(i, 1, n+1)	{
		rep(j, 1, n+1) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

char nodes[507];
bool visit[507];
vector<int> adj[507];

void bfs (int s, char c) {

	queue<int> q;
	q.push(s);
	nodes[s] = c;
	visit[s] = true;
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!visit[x]) {
				nodes[x] = c;
				visit[x] =true;
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		char temp = i;
		i = j;
		j = temp;
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	cin>>n>>m;
	//Adjacency Matrix bool type if edge is present
	bool arr[507][507];
	//memset for the adjacency matrix
	for(int i=0; i<n+2; i++) {
		for(int j=0; j<n+2; j++) {
			arr[i][j] =false;
		}
	}
	//Input all the edges
	for(int i=0; i<m; i++) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}

	memset(visit, 0, sizeof(visit));
	bool  foundSource = false;
	//finding nodes to mark b
	for(int i=1; i<=n; i++){
		if(adj[i].size() == n-1) {
			//cout<<"Following nodes are connected to all others : "<<endl;
			//cout<<i<<endl;
			nodes[i] = 'b';
			visit[i] = true;
		} else if(!foundSource) {
			s = i;
			foundSource = true;
			//cout<<foundSource<<" "<<i<<" "<<n-1<<" "<<adj[i].size()<<endl;
		}
	}
	//cout<<"FSOURCE"<<endl;

	//assigning 'a' to not visited vertices and their adjacent nodes
	if(foundSource && !visit[s]) {
		//cout<<"Source vertext to start marking a's : "<<s<<endl;
		bfs(s, 'a');
	}
	//finding a vertex to start marking it and it's neighbours 'c'
	for(int i=1; i<=n; i++) {
		if(!visit[i]) {
			//cout<<"Source vertext to start marking c's : "<<i<<endl;
			bfs(i, 'c');
			break;
		}
	}

	for(int i=1; i<=n; i++) {
		if(!visit[i]) {
			//cout<<"Un - visited verices exist!"<<endl;
			cout<<"No"<<endl;
			return 0;
		}
	}

	for(int i=1; i<=n; i++)	{
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if((nodes[i]==nodes[j] || isNeighbour(nodes[i], nodes[j])) && !arr[i][j]) {
					//cout<<"Egde should be present but no such edge!"<<endl;
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	for(int i=1; i<=n; i++) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[1000];

void bfs (int s, vi adj[]) {

	queue<int> q;
	q.push(s);
	nodes[s] = 'a';
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = 'a';
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		swap(i, j);
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s;
	S2(n,m);

	vi adj[1000];

	bool arr[505][505];

	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, 0, sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}

	bfs(s, adj);

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			nodes[i] = 'c';
		}
	}

	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if(nodes[i]==nodes[j] && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
				if(isNeighbour(nodes[i], nodes[j]) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
vi adj[507];

void bfs (int s) {

	queue<int> q;
	q.push(s);
	nodes[s] = 'a';
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = 'a';
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		swap(i, j);
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s;
	S2(n,m);

	bool arr[507][507];

	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}

	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, 0, sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}

	bfs(s);

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			nodes[i] = 'c';
		}
	}

	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if(nodes[i]==nodes[j] && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
				if(isNeighbour(nodes[i], nodes[j]) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <cstdio>
#include <cmath>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <map>
#include <cassert>
#include <string>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;

#define rep(i,a,b) for(int i=a; i<b; i++)
#define S(x) scanf("%d", &x)
#define S2(x,y) scanf("%d %d", &x, &y)
#define P(x) printf("%d\n", x)
#define all(v) v.begin(),v.end()
#define mp make_pair
#define pb push_back
#define FF first
#define SS second

typedef long long int LL;
typedef pair<int, int> pii;
typedef vector<int> vi;

char nodes[507];
vi adj[507];

void bfs (int s) {

	queue<int> q;
	q.push(s);
	nodes[s] = 'a';
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i=0; i<adj[t].size(); i++) {
			int x = adj[t][i];
			if(!nodes[x]) {
				nodes[x] = 'a';
				q.push(x);
			}
		}
	}
}

bool isNeighbour(char i, char j) {
	if(i>j) {
		swap(i, j);
	}
	return ((i=='a'&&j=='b')||(i=='b'&&j=='c'));
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, x, y, s = -1;
	S2(n,m);
	if(n==2 && m==1) {
		cout<<"Yes"<<endl<<"bb"<<endl;
		return 0;
	}
	bool arr[507][507];

	rep(i, 0, n+2) {
		rep(j, 0, n+2) {
			arr[i][j] =false;
		}
	}

	rep(i, 0, m) {
		cin>>x>>y;
		arr[x][y] = arr[y][x] = true;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	memset(nodes, 0, sizeof(nodes));
	bool  foundSource = false;
	rep(i, 1, n+1) {
		if(adj[i].size() == n-1) {
			nodes[i] = 'b';
		} else if(!foundSource) {
			s = i;
			foundSource = true;
		}
	}
	if(foundSource && s!=-1) {
		bfs(s);
	}

	rep(i, 1, n+1) {
		if(!nodes[i]) {
			nodes[i] = 'c';
		}
	}

	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i!=j) {
				if(nodes[i]==nodes[j] && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
				if(isNeighbour(nodes[i], nodes[j]) && !arr[i][j]) {
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}

	cout<<"Yes"<<endl;
	rep(i, 1, n+1) {
		cout<<nodes[i];
	}
	cout<<endl;
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    FOR(i,1,n) {
        int cnt = 0;
        FOR(j,1,n) cnt += a[i][j];
        if (cnt == n-1) g[i] = 2;
    }

    FOR(i,1,n) {
        if (g[i] == 0) {
            g[i] = 1;
            FOR(j,1,n) if (i != j) {
                if (a[i][j]) {
                    if (g[j] == 3) return puts(No);
                    if (g[j] == 1 || g[j] == 2) continue;
                    g[j] = 1;
                }
                else {
                    if (g[j] == 1 || g[j] == 2) return puts("No");
                    if (g[j] == 3) continue;
                    g[j] = 3;
                }
            }
        }
    }

    FOR(i,1,n) FOR(j,i+1,n) {
        if (a[i][j] == 0) {
            if (g[i]*g[j] != 3) return puts("No");
        }
        else {
            if (g[i]*g[j] == 3) return puts("No");
        }
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    int t = 0;
    FOR(i,1,n) {
        int cnt = 0;
        FOR(j,1,n) {
            cnt += a[i][j];
            if (i < j && a[i][j] == 0) f[++t] = {i,j};
        }
        if (cnt == n-1) g[i] = 2;
    }

    FOR(i,1,t) {
        int u = f[i].X, v = f[i].Y;
        if (g[u] == 0 && g[v] == 0) {g[u] = 1; g[v] = 3; continue;}
        if (g[u] == 0) {g[u] = g[v] == 1 ? 3 : 1; continue;}
        if (g[v] == 0) {g[v] = g[u] == 1 ? 3 : 1; continue;}
        if (g[u]*g[v] != 3) return puts("No");
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    int t = 0;
    FOR(i,1,n) FOR(j,i+1,n) FOR(k,j+1,n) {
        int cnt = a[i][j] + a[j][k] + a[i][k];
        if (cnt == 2) return puts("No");
        if (a[i][j] == 0) f[++t] = {i,j};
    }

    FOR(i,1,t) {
        int u = f[i].X, v = f[i].Y;
        if (g[u] == 0 && g[v] == 0) {g[u] = 1; g[v] = 3; continue;}
        if (g[u] == 0) {g[u] = g[v] == 1 ? 3 : 1; continue;}
        if (g[v] == 0) {g[v] = g[u] == 1 ? 3 : 1; continue;}
        if (g[u]*g[v] != 3) return puts("No");
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 0) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    int t = 0;
    FOR(i,1,n) {
        int cnt = 0;
        FOR(j,1,n) {
            cnt += a[i][j];
            if (i < j && a[i][j] == 0) f[++t] = {i,j};
        }
    }

    FOR(i,1,t) {
        int u = f[i].X, v = f[i].Y;
        if (g[u] == 0 && g[v] == 0) {g[u] = 1; g[v] = 3; continue;}
        if (g[u] == 0) {g[u] = g[v] == 1 ? 3 : 1; continue;}
        if (g[v] == 0) {g[v] = g[u] == 1 ? 3 : 1; continue;}
        if (g[u]*g[v] != 3) return puts("No");
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505;
int n, m, a[N][N], g[N];
vector<int> e[N];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        a[u][v] = a[v][u] = 1;
        e[u].pb(v); e[v].pb(u);
    }

    FOR(i,1,n) if (e[i].size() == n-1) g[i] = 2;

    FOR(i,1,n) {
        if (g[i] == 0) {
            g[i] = 1;
            FOR(j,1,n) if (i != j) {
                if (a[i][j]) {
                    if (g[j] == 3) return puts("No");
                    if (g[j] == 1 || g[j] == 2) continue;
                    g[j] = 1;
                }
                else {
                    if (g[j] == 1 || g[j] == 2) return puts("No");
                    if (g[j] == 3) continue;
                    g[j] = 3;
                }
            }
        }
    }
/*
    FOR(i,1,n) FOR(j,i+1,n) {
        if (a[i][j] == 0) {
            if (g[i]*g[j] != 3) return puts("No");
        }
        else {
            if (g[i]*g[j] == 3) return puts("No");
        }
    }
*/
    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    int t = 0;
    FOR(i,1,n) {
        int cnt = 0;
        FOR(j,1,n) {
            cnt += a[i][j];
            if (i < j && a[i][j] == 0) f[++t] = {i,j};
        }
        if (cnt == n-1) g[i] = 2;
    }

    FOR(i,1,t) {
        int u = f[i].X, v = f[i].Y;
        if (g[u] == 0 && g[v] == 0) {g[u] = 1; g[v] = 3; continue;}
        if (g[u] == 0) {g[u] = g[v] == 1 ? 3 : 1; continue;}
        if (g[v] == 0) {g[v] = g[u] == 1 ? 3 : 1; continue;}
        if (g[u]*g[v] != 3) return puts("No");
    }

    FOR(i,1,n) FOR(j,i+1,n) {
        if (a[i][j] == 0) {
            if (g[i]*g[j] != 3) return puts("No");
        }
        else {
            if (abs(g[j]-g[i]) == 2) return puts("No");
        }
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505;
int n, m, a[N][N], g[N];
vector<int> e[N];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        a[u][v] = a[v][u] = 1;
        e[u].pb(v); e[v].pb(u);
    }

    FOR(i,1,n) if (e[i].size() == n-1) g[i] = 2;

    //FOR(i,1,n) if (g[i] == 2) printf("%d\n", i);

    FOR(i,1,n) {
        if (g[i] == 0) {
            g[i] = 1;
            FOR(j,1,n)
                if (g[j] == 0) g[j] = a[i][j] ? 1 : 3;
        }
    }

    FOR(i,1,n) FOR(j,i+1,n) {
        if (a[i][j] == 0) {
            if (g[i]*g[j] != 3) return puts("No");
        }
        else {
            if (g[i]*g[j] == 3) return puts("No");
        }
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    int t = 0;
    FOR(i,1,n) {
        int cnt = 0;
        FOR(j,1,n) {
            cnt += a[i][j];
            if (i < j && a[i][j] == 0) f[++t] = {i,j};
        }
        if (cnt == n-1) g[i] = 2;
    }

    FOR(i,1,t) {
        int u = f[i].X, v = f[i].Y;
        if (g[u] == 0 && g[v] == 0) {g[u] = 1; g[v] = 3; continue;}
        if (g[u] == 0) {g[u] = g[v] == 1 ? 3 : 1; continue;}
        if (g[v] == 0) {g[v] = g[u] == 1 ? 3 : 1; continue;}
        if (g[u]*g[v] != 3) return puts("No");
    }

    FOR(i,1,n) FOR(j,i+1,n) {
        if (a[i][j] == 0) {
            if (g[i]*g[j] != 3) return puts("No");
        }
        else {
            if (g[i]*g[j] == 3) return puts("No");
        }
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long llu;

#define X  first
#define Y  second
#define pb push_back
#define OK puts("OK")
#define EL printf("\n")
#define FOR(x,l,r) for (auto x=l;x<=r;x++)
#define FOD(x,l,r) for (auto x=l;x>=r;x--)

const int N = 505, M = 1e5+5;
int n, m, a[N][N], g[N];
ii e[M], f[M];

int main()
{
    //freopen("INP.INP","r",stdin);
    //freopen("OUT.OUT","w",stdout);

    scanf("%d%d", &n,&m);
    FOR(i,1,m) {
        int u, v; scanf("%d%d", &u,&v);
        e[i] = {u,v}; a[u][v] = a[v][u] = 1;
    }

    FOR(i,1,n) {
        int cnt = 0;
        FOR(j,1,n) cnt += a[i][j];
        if (cnt == n-1) g[i] = 2;
    }

    FOR(i,1,n) {
        if (g[i] == 0) {
            g[i] = 1;
            FOR(j,1,n) if (i != j) {
                if (a[i][j]) {
                    if (g[j] == 3) return puts("No");
                    if (g[j] == 1 || g[j] == 2) continue;
                    g[j] = 1;
                }
                else {
                    if (g[j] == 1 || g[j] == 2) return puts("No");
                    if (g[j] == 3) continue;
                    g[j] = 3;
                }
            }
        }
    }

    FOR(i,1,n) FOR(j,i+1,n) {
        if (a[i][j] == 0) {
            if (g[i]*g[j] != 3) return puts("No");
        }
        else {
            if (g[i]*g[j] == 3) return puts("No");
        }
    }

    puts("Yes");
    FOR(i,1,n)
        if (g[i] == 1) printf("a");
        else if (g[i] == 2) printf("b");
        else printf("c");
    EL;

    return 0;
}