One day student Vasya was sitting on a lecture and mentioned a string s1s2... sn, consisting of letters "a", "b" and "c" that was written on his desk. As the lecture was boring, Vasya decided to complete the picture by composing a graph G with the following properties:   G has exactly n vertices, numbered from 1 to n.  For all pairs of vertices i and j, where i ≠ j, there is an edge connecting them if and only if characters si and sj are either equal or neighbouring in the alphabet. That is, letters in pairs "a"-"b" and "b"-"c" are neighbouring, while letters "a"-"c" are not. Vasya painted the resulting graph near the string and then erased the string. Next day Vasya's friend Petya came to a lecture and found some graph at his desk. He had heard of Vasya's adventure and now he wants to find out whether it could be the original graph G, painted by Vasya. In order to verify this, Petya needs to know whether there exists a string s, such that if Vasya used this s he would produce the given graph G.

The first line of the input contains two integers n and m  — the number of vertices and edges in the graph found by Petya, respectively. Each of the next m lines contains two integers ui and vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — the edges of the graph G. It is guaranteed, that there are no multiple edges, that is any pair of vertexes appear in this list no more than once.

In the first line print "Yes" (without the quotes), if the string s Petya is interested in really exists and "No" (without the quotes) otherwise. If the string s exists, then print it on the second line of the output. The length of s must be exactly n, it must consist of only letters "a", "b" and "c" only, and the graph built using this string must coincide with G. If there are multiple possible answers, you may print any of them.

NoteIn the first sample you are given a graph made of two vertices with an edge between them. So, these vertices can correspond to both the same and adjacent letters. Any of the following strings "aa", "ab", "ba", "bb", "bc", "cb", "cc" meets the graph's conditions. In the second sample the first vertex is connected to all three other vertices, but these three vertices are not connected with each other. That means that they must correspond to distinct letters that are not adjacent, but that is impossible as there are only two such letters: a and c.

#include <bits/stdc++.h>

#define pb push_back
#define ll long long
#define f first
#define s second
#define ld long double

using namespace std;

void data() {
    #ifdef NURS
        freopen("main.in", "r", stdin);
        freopen("main.out", "w", stdout);
    #endif
	//freopen("socdist.in","r",stdin);
	//freopen("socdist.out","w",stdout);
}

const ll N = 5e2 + 200;
const ll Nt = 4e6;
const ll mod = 1e9 + 7;
const ll hh = 27;

int n, m, bad;
vector<int> g[N];
char ans[N];
int path[N][N];
void insert()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		int u, v;
		cin >> u >> v;
		path[u][v] = 1;
		path[v][u] = 1;
		g[u].pb(v);
		g[v].pb(u);
	}
}
void check()
{
	vector<int> a, b, c;
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] == 'a')
		{
			a.pb(i);
		}
		else if (ans[i] == 'b')
		{
			b.pb(i);
		}
		else
		{
			c.pb(i);
		}
	}
	for (int i = 0; i < a.size(); i++)
	{
		int u = a[i];
		for (int j = 0; j < b.size(); j++)
		{
			int v = b[j];
			if (path[u][v] == 0)
			{
				bad = 1;
			}
		}
		for (int j = 0; j < a.size(); j++)
		{
			int v = a[j];
			if (v == u)
			{
				continue;
			}
			if (path[u][v] == 0)
			{
				bad = 1;
			}
		}
	}
	for (int i = 0; i < c.size(); i++)
	{
		int u = c[i];
		for (int j = 0; j < b.size(); j++)
		{
			int v = b[j];
			if (path[u][v] == 0)
			{
				bad = 1;
			}
		}
		for (int j = 0; j < c.size(); j++)
		{
			int v = c[j];
			if (v == u)
			{
				continue;
			}
			if (path[u][v] == 0)
			{
				bad = 1;
			}
		}
	}
	for (int i = 0; i < b.size(); i++)
	{
		int u = b[i];
		for (int j = 0; j < b.size(); j++)
		{
			int v = b[j];
			if (u == v)
			{
				continue;
			}
			if (path[u][v] == 0)
			{
				bad = 1;
			}
		}
	}
	for (int i = 0; i < a.size(); i++)
	{
		int u = a[i];
		for (int j = 0; j < c.size(); j++)
		{
			int v = c[j];
			if (path[u][v])
			{
				bad = 1;
			}
		}
	}
}
void solve()
{
	for (int i = 1; i <= n; i++)
	{
		ans[i] = 'z';
	}
	//b-find
	for (int i = 1; i <= n; i++)
	{
		int kek[n + 1] = {0};
		kek[i] = 1;
		for (int j = 0; j < g[i].size(); j++)
		{
			int v = g[i][j];
			kek[v] = 1;
		}
		int ok = 0;
		for (int j = 1; j <= n; j++)
		{
			if (kek[j] == 0)
			{
				ok = 1;
			}
		}
		if (!ok)
		{
			ans[i] = 'b';
		}
	}
	//b-end
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] == 'z')
		{
			ans[i] = 'c';
			for (int j = 0; j < g[i].size(); j++)
			{
				int v = g[i][j];
				if (ans[v] != 'b')
				{
					ans[v] = 'c';
				}
			}
			break;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] == 'z')
		{
			ans[i] = 'a';
		}
	}
	check();
	if (bad)
	{
		cout << "No\n";
		return;
	}
	cout << "Yes\n";
	for (int i = 1; i <= n; i++)
	{
		cout << ans[i];
	}
}
int main()
{
	data();
	insert();
	solve();
}

/*
our future is up to us
1)так мы можем найти бшки и что еще?
2)найдя бшки мы можем найти одинаковые буквы
3)как найти что это неправильный граф?
*/

#include <sstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <set>
#include <queue>
#include <cmath>
#include <map>
#define PI         M_PI
#define INF        LONG_LONG_MAX
#define LL         __int64
#define PII        pair <int,int>
#define PLL        pair <LL,LL>
#define MP(x,y)    make_pair((x),(y))
#define VINT       vector <int>
#define VLL        vector <LL>
#define VVINT      vector < VINT >
#define VVLL       vector < VLL >
#define GET1(x)    (x).first
#define IT1(x)     ((x)->first)
#define IT2(x)     ((x)->second)
#define sqr(x)     ((x)*(x))
#define GET2(x)    (x).second
#define FU(x,y,z)  for(x=(y);(x)<(z);(x++))
#define FUN(x,y,z) for(int x=(y);(x)<(z);(x++))
#define NL         cout << endl
#define GETS(s)    getline(cin,s)
#define READ(x)    cin >> x
#define READLN(x)  cin >> x; cin.get()
#define PRINT(x)   cout << x
#define PRINTLLN(x) cout << x << endl
#define FILL(A,x)  memset(A,(x),sizeof(A))
#define SINT       set <int>
#define SPII       set < PII >
#define SLL        set <LL>
#define SPLL       set < PLL >
#define ALL(a)     a.begin(),a.end()
#define PREC(n)    cout.precision(n)
#define ISTREAM(name,s)    istringstream name(s)
#define TRUE 1
#define FALSE 0

struct coord
{
       LL x,y;
};

inline bool isline(coord a, coord b,coord c)
{
     coord v,d;
     v.x=a.x-b.x;
     v.y=a.y-b.y;
     d.x=b.x-c.x;
     d.y=b.y-c.y;
     if(v.x*d.y==v.y*d.x)
     return 1;
     else
     return 0;
}

inline LL dist(coord a,coord b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

using namespace std;

//#define INTEST
int g[500][500];
int n,m;

int main()
{
    int n,m;
    string s;
    cin >> n >> m;cin.get();
    s.resize(n);
    FILL(g,0);
    FUN(i,0,m)
    {
              int x,y;
              cin >> x >> y;cin.get();
              g[x-1][y-1]=1;g[y-1][x-1]=1;
    }
    FUN(i,0,n)
     {
              int cnt=0;
              FUN(j,0,n)
              if(i!=j)
              cnt+=g[i][j];
              if(cnt==n-1)
              s[i]='b';
     }
    bool pos=1;
    FUN(i,0,n)
    if(s[i]!='b')
    {
                 s[i]='a';
                 FUN(j,0,n)
                 if(i!=j)
                 if(g[i][j] && s[j]!='b')
                  s[j]='a';
                 else
                 if(!g[i][j] && s[j]!='b')
                  s[j]='c';
                 break;
    }
    FUN(i,0,n)
     FUN(j,i+1,n)
     {
                 if(g[i][j])
                 if(abs(s[i]-s[j])>1)
                 {
                                     pos=0;
                                     break;
                 }
                 if(!g[i][j])
                 if(abs(s[i]-s[j])<2)
                 {
                                     pos=0;
                                     break;
                 }
     }
    if(pos)
    cout << "YES" << endl << s << endl;
    else
    cout << "NO" << endl;
}

#include <bits/stdc++.h>
#define fst first
#define snd second
#define pb push_back
#define IO ios_base::sync_with_stdio(0); cin.tie(0);
#define endl '\n'
using namespace std;

int n,m;
bool mat[505][505];
bool B[505];
bool A[505];
bool C[505];

int main()
{
	IO
	cin>>n>>m;
	int u,v;
	for(int i = 0; i < m; ++i){
		cin>>u>>v;
		mat[u][v] = true;
		mat[v][u] = true;
	}
	for(int i = 1; i <= n; ++i){
		mat[i][i] = true;
	}

	for(int i = 1; i <= n; ++i){
		bool fl = true;
		for(int j = 1; j <= n; ++j){
			if(!mat[i][j]){
				fl = false;
				break;
			}
		}
		if(fl){
			B[i] = true;
		}
	}

	for(int i = 1; i <= n; ++i){
		if(!B[i]){
			A[i] = true;
			for(int j = 1; j <= n; ++j){
				if(mat[i][j] && !B[j]){
					A[j] = true;
				}
			}
			break;
		}
	}

	for(int i = 1; i <= n; ++i){
		if(!B[i] && !A[i]){
			C[i] = true;
		}
	}

	for(int i = 1; i <= n; ++i){
		for(int j = i+1; j <= n; ++j){
			if((A[i] && C[j]) || (A[j] && C[i])){
				if(mat[i][j]){
					cout<<"No"<<endl;
					return 0;
				}
			}
			if((A[i] && A[j]) || (B[i] && B[j]) || (C[i] && C[j])){
				if(!mat[i][j]){
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}
	cout<<"Yes"<<endl;
	for(int i = 1; i <= n; ++i){
		if(A[i])
			cout<<"a";
		if(B[i])
			cout<<"b";
		if(C[i])
			cout<<"c";
	}
	cout<<endl;

	return 0;
}

#include <bits/stdc++.h>

using namespace std;
#define  ll long long
const int N = 505;
int g[N][N], g2[N][N];

void kill() {
    cout << "No";
    exit(0);
}

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

    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        g[--u][--v] = 1, g[v][u] = 1;
    }
    int a = -1, c = -1;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (!g[i][j]) a = i, c = j;
        }
    }
    if (a == -1) {
        cout << "Yes" << endl;
        cout << string(n, 'a');
        return 0;
    }
    string ans = string(n, '?');
    ans[a] = 'a';
    ans[c] = 'c';
    for (int i = 0; i < n; i++) {
        if (i == a || g[a][i])continue;
        ans[i] = 'c';
    }
    for (int i = 0; i < n; i++) {
        if (i == c || g[c][i])continue;
        ans[i] = 'a';
    }
    for (auto &c:ans) if (c == '?') c = 'b';
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j)continue;
            g2[i][j] = abs(ans[i] - ans[j]) <= 1;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (g[i][j] != g2[i][j])kill();
        }
    }
    cout << "Yes" << endl << ans;
    return 0;
}

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

typedef long long ll;
typedef vector <int> vi;
typedef pair< int ,int > pii;
typedef istringstream iss;
typedef ostringstream oss;
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define sz size()
#define ln length()
#define rep(i,n) for(int i=0;i<n;i++)
#define fu(i,a,n) for(int i=a;i<=n;i++)
#define fd(i,n,a) for(int i=n;i>=a;i--)
#define all(a)  a.begin(),a.end()
#define ESP (1e-9)

#define gi(n) scanf("%d",&n)
#define gl(n) cin >> n
#define pi(n) printf("%d",n)
#define pl(n) cout << n
#define ps printf(" ")
#define pn printf("\n")
#define dg(n,s); printf("%s %d",s,n)
#define imax numeric_limits<int>::max()
#define imin numeric_limits<int>::min()
#define lmax numeric_limits<ll>::max()
#define lmin numeric_limits<ll>::min()

#define mod 1000000007
#define NK 1100000
int seen[605] ,vis[510][510] ,s[510];
vector <int  > g[605] ;
int m, n ,x ,y ,m1, m2 ,f3 = 1 ;
int f[5] = {0 , 1 , 3 } ;
void dfs(int x , int f1 , int pr ) {
	if(s[x]){
		if(s[x] == f [f1 ^ 3])  {
			f3 = 0 ;
			return ;
		}
	}
	if(seen[x])  return ;
	seen[x] = 1 ;
	s[x] = f[f1] ;
	for (int i = 1 ; i <= n ; i++){
		 if(i == pr  || vis[x][i] ||i == x )  continue ;
		 dfs(i , f1^ 3 , x) ;
	}

}
int main() {
	gi(n) , gi(m) ;
	while(m--){
		gi(x) , gi(y) ;
		vis[x][y] = 1 ;
		vis[y][x] = 1 ;
		g[x].pb(y) ;
		g[y].pb(x) ;
    }
    for(int i = 1 ; i<= n  ;i++) s[i] = 2 ;
    for (int j = 1 ; j<= n && f3 ; j++){
    	 if(s[j] == 2 && g[j].size() < n - 1  )   dfs(j , 1 , -1) ;
	}
	for ( int i = 1 ; i <= n && f3 ; i++){
		for (int j =  1 ; j <= n  ; j++){
			 if(i == j )   continue ;
			 if(abs(s[i] - s[j]) <= 1 && !vis[i][j] ){
			 	 f3 = 0 ;
			 	 break;
			 }
			 if(abs(s[i] - s[j]) == 2 && vis[i][j]){
			 	f3 = 0;
			 	break;
			 }
		}
	}
	if(f3){
		puts("Yes") ;
		for (int i = 1 ; i<= n ; i++){
			putchar('a' + s[i] - 1) ;
		}
	}
	else    puts("No") ;
	return 0 ;
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <cassert>
#include <algorithm>
#include <iomanip>
#include <ctime>
#include <cmath>
#include <bitset>

#pragma comment(linker, "/STACK:256000000")

using namespace std;

typedef long long int int64;
typedef long double double80;

const int INF = (1 << 29) + 5;
const int64 LLINF = (1ll << 59) + 5;
const int MOD = 1000 * 1000 * 1000 + 7;

const int MAX_N = 505;

void no_exit()
{
	printf("No");
	exit(0);
}

int n, m;
bool graph[MAX_N][MAX_N];
bool graph2[MAX_N][MAX_N];
int cnt1[MAX_N];
bool used[MAX_N];
int st[MAX_N];
int timer = 5;

void dfs(int v, int number)
{
	used[v] = true;
	st[v] = number;
	for (int i = 1; i <= n; ++i)
	{
		if (v != i)
		{
			if (!graph[v][i])
			{
				if (used[i])
				{
					if (st[i] == st[v])
					{
						no_exit();
					}
				}
				else
				{
					if (number == 1)
					{
						dfs(i, 2);
					}
					else
					{
						dfs(i, 1);
					}
				}
			}
		}
	}
}

int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);

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

	memset(cnt1, 0, sizeof(cnt1));
	memset(st, 0, sizeof(st));
	memset(graph, 0, sizeof(graph));
	memset(graph2, 0, sizeof(graph2));
	memset(used, 0, sizeof(used));

	int v1, v2;
	for (int i = 0; i < m; ++i)
	{
		scanf("%d %d", &v1, &v2);
		graph[v1][v2] = true;
		graph[v2][v1] = true;
		++cnt1[v1];
		++cnt1[v2];
	}

	//for (int i = 1; i <= n; ++i)
	//{
	//	for (int j = 1; j <= n; ++j)
	//	{
	//		if (!graph[i][j] && i != j)
	//		{
	//			if (st[i] == 0 && st[j] == 0)
	//			{
	//				st[i] = 1; st[j] = 2;
	//			}
	//			else if (st[i] == 0)
	//			{
	//				if (st[j] == 1)
	//				{
	//					st[i] = 2;
	//				}
	//				else
	//				{
	//					st[i] = 1;
	//				}
	//			}
	//			else if (st[j] == 0)
	//			{
	//				if (st[i] == 1)
	//				{
	//					st[j] = 2;
	//				}
	//				else
	//				{
	//					st[j] = 1;
	//				}
	//			}
	//			else if (st[i] == st[j])
	//			{
	//				for (int k = 1; k <= n; ++k)
	//				{
	//					if (!graph[j][k])
	//					{
	//						if (graph[i][k])
	//					}
	//				}
	//			}
	//			else
	//			{
	//				no_exit();
	//			}
	//		}
	//	}
	//}

	int cnt = 0;
	for (int i = 1; i <= n; ++i)
	{
		if (!used[i])
		{
			if (cnt1[i] == n - 1)
			{
				st[i] = 3;
			}
			else
			{
				dfs(i, 1);
				++cnt;
			}
		}
	}

	if (cnt > 1)
	{
		no_exit();
	}

	//for (int i = 1; i <= n; ++i)
	//{
	//	if (st[i] != 0)
	//	{
	//		st[i] = 3;
	//	}
	//}

	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			if (i != j)
			{
				if (st[i] == 1 && st[j] == 2)
				{
					graph2[i][j] = false;
				}
				else if (st[i] == 2 && st[j] == 1)
				{
					graph2[i][j] = false;
				}
				else
				{
					graph2[i][j] = true;
				}

				if (graph[i][j] != graph2[i][j])
				{
					no_exit();
				}
			}
		}
	}

	printf("Yes\n");
	for (int i = 1; i <= n; ++i)
	{
		if (st[i] == 1)
		{
			printf("a");
		}
		else if (st[i] == 2)
		{
			printf("c");
		}
		else
		{
			printf("b");
		}
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}

//if (graph[i][j] && graph[i][q] && graph[j][q])
//{
//	if (st[i] == 0 && st[j] == 0 && st[q] == 0)
//	{
//		st[i] = st[j] = st[q] = timer;
//		++timer;
//	}
//	else if (st[i] == 0 && st[j] == 0)
//	{
//		st[i] = st[q]; st[j] = st[q];
//	}
//	else if (st[i] == 0 && st[q] == 0)
//	{
//		st[i] = st[j]; st[q] = st[j];
//	}
//	else if (st[j] == 0 && st[q] == 0)
//	{
//		st[j] = st[i], st[q] = st[i];
//	}
//	else if (st[i] == 0)
//	{
//		if (st[j] != st[q])
//		{
//			no_exit();
//		}
//		else
//		{
//			st[i] = st[j];
//		}
//	}
//	else if (st[j] == 0)
//	{
//		if (st[i] != st[q])
//		{
//			no_exit();
//		}
//		else
//		{
//			st[j] = st[i];
//		}
//	}
//	else if (st[q] == 0)
//	{
//		if (st[i] != st[j])
//		{
//			no_exit();
//		}
//		else
//		{
//			st[q] = st[i];
//		}
//	}
//	if (st[i] == st[j] && st[j] == st[q])
//	{
//		continue;
//	}
//	else
//	{
//		no_exit();
//	}
//}

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <iostream>
#include <map>
#include <iomanip>
#include <stack>
#include <sstream>
#include <queue>
#include <set>
#include <functional>

#define endl '\n'
#define eps 1e-9
#define ll long long int

using namespace std;

bool edges[505][505];
char state[505];

bool dfs(int n){
	stack<int> s;
	bool flag2 = false;
	int start = -1;
	for (int i = 1; i <= n; i++){
		bool flag = true;
		for (int j = 1; j <= n; j++){
			if (!edges[i][j] && j != i) {flag = false; break;}
		}
		if (flag){
			state[i] = 'b';
		} else if (!flag2){
			flag2 = true;
			start = i;
		}
	}
	if (start == -1) return true;
	state[start] = 'a';
	for (int i = 1; i <= n; i++){
		if (!edges[start][i] && i != start) {
			state[i] = 'c';
			s.push(i);
		}
	}
	while (!s.empty()){
		int cur = s.top();
		s.pop();
		char curState = state[cur];
		for (int i = 1; i <= n; i++){
			if (!edges[cur][i] && i != cur){
				if (state[i] == curState) return false;
				else if (state[i] != 'a' && state[i] != 'b' && state[i] != 'c'){
					if (curState == 'a') {
						state[i] = 'c';
					}
					else state[i] = 'a';
					s.push(i);
				}
			}
			else if (i != cur){
				if (state[i] != state[cur] && state[i] != 'b') return false;
			}
		}
	}
	return true;

}

int main(){
	for (int i = 0; i < 505; i++){
		state[i] = 'd';
	}
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	if (n == 1){
		if (m == 0){
			cout << "Yes" << endl << "a";
			return 0;
		}
		else{
			cout <<"No";
			return 0;
		}
	}
	if (n == 2){
		if (m == 0){
			cout << "Yes\nac";
			return 0;
		}
		else if (m == 1){
			cout << "Yes\naa";
			return 0;
		}
		else{
			cout << "No";
			return 0;
		}
	}
	for (int i = 0; i < m; i++){
		int x, y;
		cin >> x >> y;
		edges[x][y] = true;
		edges[y][x] = true;
	}
	bool correct = dfs(n);
	if (correct){
		for (int i = 1; i <= n; i++){
			if (state[i] == 'd'){
				correct = false;
				break;
			}
			/*if (state[i] == 'b') continue;
			for (int j = 1; j <= n; j++){
				if (i != j){
					if (state[i] == state[j])
				}
			}*/
		}
	}
	if (!correct){
		cout << "No";
		return 0;
	}
	cout << "Yes" << endl;
	for (int i = 1; i <= n; i++){
		cout << state[i];
	}

}

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9+7;
const int inf = 1061109567;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
int a[260000], b[260000], de[505], c[505];
int mp[505][505];
int main()
{
    int n, m, pos = 0;
    cin>>n>>m;
    for(int i = 0; i<m; i++) {
        scanf("%d%d", &a[i], &b[i]);
        de[a[i]]++, de[b[i]]++;
        mp[a[i]][b[i]] = mp[b[i]][a[i]] = 1;
    }
    for(int i = 1; i<=n; i++) {
        if(de[i] == n-1) {
            c[i] = 2;
        }
    }
    for(int i = 1; i<=n; i++) {
        if(!c[i]) {
            pos = i;
            c[i] = 1;
            break;
        }
    }
    if(!pos) {
        puts("Yes");
        for(int i = 0; i<n; i++)
            cout<<'b';
        return 0;
    }
    for(int i = 1; i<=n; i++) {
        if(i == pos)
            continue;
        if(!mp[i][pos])
            c[i] = 3;
        else if(!c[i])
            c[i] = 1;
    }
    int flag = 0;
    for(int i = 1; i<=n; i++) {
        for(int j = i+1; j<=n; j++) {
            if(abs(c[i]-c[j])>1&&mp[i][j]) {
                flag = 1;
            }
            if(abs(c[i]-c[j])<=1 && !mp[i][j]) {
                flag = 1;
            }
        }
    }
    if(flag) {
        puts("No");
        return 0;
    } else {
        puts("Yes");
        for(int i = 1; i<=n; i++) {
            cout<<char('a'+c[i]-1);
        }
        cout<<endl;
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("unroll-loops")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long
#define fr(i,a,b) for(int i = a ; i <= b ; ++i)
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) begin(x), end(x)
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int)(x).size()
#define pb push_back
#define fst first
#define snd second
using namespace __gnu_pbds;
using ordered_set =
 tree<int, null_type,less<int>,
 rb_tree_tag,tree_order_statistics_node_update>;
//find_by_order(k):returns iterator to kth element starting from 0
//order_of_key(k):returns count of elements strictly smaller than k
typedef long long ll;typedef pair<int, int> pii;
typedef vector<int> vi;typedef long double ld;
template<class T>
using min_heap = priority_queue<T,vector<T>,greater<T>>;
template<typename T> T gcd(T a, T b){return(b?__gcd(a,b):a);}
template<typename T> T lcm(T a, T b){return(a*(b/gcd(a,b)));}
template<class T> void re(T& x) { cin >> x; }
template<typename T>
void remdup(vector<T>& v) {
	sort(all(v)); v.erase(unique(all(v)), v.end());
}
template<typename T> void re(vector<T> &v) {trav(i,v) cin >> i;}
template<class H, class... T> void re(H& h, T&... t) { re(h); re(t...); }
void unsyncIO() { ios_base::sync_with_stdio(0); cin.tie(0); }
#ifdef np
#include "/home/wjex/cp/pr.h"
#else
#define trace(...)
#endif

constexpr int MOD = 1000000007;
constexpr int Nx = 505+5; //

int g[Nx+1][Nx+1];
char ans[Nx+1];

void dfs(){

}

void NO(){
	cout << "NO\n";
	exit(0);
}

void solve(){
	int n , m ; re(n,m);
	memset(g,0,sizeof g);
	fr(i,1,m){
		int a ,b ;
		re(a,b);
		a--;b--;
		g[a][b] = 1 ;
		g[b][a] = 1;
	}
	int pos1 = -1 , pos2 = -1;
	rep(i,0,n){
		rep(j,0,n){
			if(g[i][j] == 0 and i != j) {
				pos1 = i ;
				pos2 = j ;
				break;
			}
		}
		if(pos1!=-1) break; //
	}
	trace(pos1,pos2);
	if(pos1!=-1){
		ans[pos1] = 'a';
		ans[pos2] = 'c' ;
		rep(i,0,n){
		//	trace("hi");
		//  trace(pos1,pos2,i);
			if(pos1 != i and pos2!=i){
				if(!g[pos1][i] and !g[pos2][i] ){
					NO();
				}
				else if(g[pos1][i] + g[pos2][i] == 1)//g[pos1][i] or g[pos2][i])
				{
					if(g[pos1][i]) ans[i] = 'a';
					else ans[i] ='c';
				}
				else ans[i] = 'b';
			}
		}
	}
	else{ //
		rep(i,0,n) ans[i] = 'a';
	}
	rep(i,0,n){
		rep(j,0,n){
			if(i!=j){

			//	trace("hi");
				if(g[i][j] and (ans[i] == 'a' and ans[j] == 'c' or ans[i] == 'c'
				 and ans[j] == 'a')){
					NO();
				}
				else if(!g[i][j] and !(ans[i] == 'a' and ans[j] == 'c' or ans[i] == 'c'
				 and ans[j] == 'a')){
					NO();
				}
			}
		}
	}
	cout << "Yes\n";
	rep(i,0,n){
		cout << ans[i] ;
	}
	cout << endl;
}

signed main() {
	unsyncIO();
	int tt =1 ;
	//cin >> tt;
	rep(i,0,tt) solve();

#ifdef np
	cout <<endl<<endl<< "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
	return 0;
}

/*
  ------------------------- Hachiikung ---------------------------------
  ---------------------- Worrachate Bosri ------------------------------
  ------ Faculty of Computer Engineering Chulalongkorn University ------
*/
#include <bits/stdc++.h>
using namespace std;
#define REP(i,FN) for(int i=0;i<FN;i++)
#define FOR(i,ST,FN) for(int i=ST;i<=FN;i++)
#define FORD(i,FN,ST) for(int i=FN;i>=ST;i--)
#define FORX(i,c) for(typeof(c.begin())i=c.begin();i!=c.end();i++)
#define pause system("pause")
#define S scanf
#define P printf
#define X first
#define Y second
#define pb push_back
#define PII pair<int,int>
#define mp make_pair
#define sz size()
#define eps 1e-8

const int MOD(1000000007);
const int INF((1<<30)-1);
const int MAXN(505);

int a[MAXN][MAXN];

string b = "";

int main(){

    int n,m;
    S("%d%d",&n,&m);
    REP(i,m)
    {
        int x,y;
        S("%d%d",&x,&y);
        a[x][y] = a[y][x] = 1;
    }

    if(n == 1)
    {
        P("Yes\n");
        P("a");
        return 0;
    }

    if(n == 2)
    {
        P("Yes\n");
        if(m == 1) P("aa");
        else P("ac");
        return 0;
    }

    FOR(i,1,n)
        FOR(j,i+1,n)
            FOR(k,j+1,n)
            {
                if(!a[i][j] && !a[i][k] && !a[j][k])
                {
                    P("No");
                    return 0;
                }
            }

    FOR(i,1,n+1)
        b += '?';

    FOR(k,1,n)
        FOR(i,1,n)
            FOR(j,1,n)
            {
                if(i == j) continue;
                if(!a[i][j])
                {
                    if(b[i] == 'a') b[j] = 'c';
                    if(b[i] == 'c') b[j] = 'a';
                    if(b[j] == 'a') b[i] = 'c';
                    if(b[j] == 'c') b[i] = 'a';
                    if(b[i] == '?' && b[j] == '?') b[i] = 'a', b[j] = 'c';
                }
            }

    FOR(i,1,n)
    {
        if(b[i] == '?')
            b[i] = 'b';
    }

    FOR(i,1,n)
        FOR(j,1,n)
        {
            if(a[i][j] && abs(b[i]-b[j]) > 1)
            {
                P("No");
                return 0;
            }
        }

    P("Yes\n");
    cout << b.substr(1,n);

}

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

#define fo(i,n) for(i=0;i<n;i++)
#define Fo(i,k,n) for(i=k;i<n;i++)
#define ll long long

#define pb push_back
#define mp make_pair
#define F first
#define S second

#define fastIO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)

#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

using namespace std;
/**************************************************************************/
vector < ll > graph1[501], graph2[501];
vector < pair < ll , ll > > edges;
ll n,m,vis[501],c1,c2,n1,n2;
set < ll > bs,st;
set < ll >::iterator ite;
string s;
void dfs(ll node, ll call = 0,ll eval = 0)
{
	if(vis[node]==1)return;
	vis[node]=1;
	if(call==1 and eval==0)st.insert(node);
	if(call==0 and eval==1)c1+=graph2[node].size(),n1++;
	else if(call==1 and eval==1)c2+=graph2[node].size(),n2++;
	for(ll x:graph2[node])dfs(x,call,eval);
}
int main()
{
	fastIO;
	ll t,i,j,k,connected_components=0;
	cin>>n>>m;
	fo(i,n)s.pb('b');
	fo(i,501){vis[i]=0;graph2[i].clear();graph1[i].clear();}
	fo(i,m)
	{
		cin>>j>>k;
		graph1[j].pb(k);
		graph1[k].pb(j);
		edges.pb({j,k});
	}

	Fo(i,1,n+1)
	{
		if(graph1[i].size()==n-1)
		{
			bs.insert(i);
		}
	}

	ll edge = 0;
	for(auto it: edges)
	{
		if(bs.find(it.F)==bs.end() and bs.find(it.S)==bs.end())
		{
			graph2[it.F].pb(it.S);
			graph2[it.S].pb(it.F);
			edge++;
		}
	}

	ll value=0; c1 = 0, c2 = 0;n1=0;n2=0;
	Fo(i,1,n+1)
	{
		if(vis[i]==0 and bs.find(i)==bs.end())
		{
			connected_components++;
			if(value==0)dfs(i,0,1);
			else dfs(i,1,1);
			value++;
		}
	}
	if(connected_components>2 or
		c1!=n1*(n1-1) or c2!=n2*(n2-1))
	{
		cout<<"No";
		return(0);
	}
	cout<<"Yes\n";

	st.clear();
	value = 0;
	fo(i,501)vis[i]=0;
	Fo(i,1,n+1)
	{
		if(vis[i]==0 and bs.find(i)==bs.end())
		{
			st.clear();
			dfs(i,1);
			for(ite = st.begin();ite!=st.end();ite++)
			{
				if(value==0)s[(*ite)-1] = 'a';
				else s[(*ite)-1] = 'c';
			}
			value++;
		}
	}
	cout<<s;
}
/*************************************************************************/

#include<bits/stdc++.h>
#define MAXN 505
using namespace std;
int mm[MAXN][MAXN];
int in[MAXN];
int val[MAXN];

void init()
{
    memset(val,0,sizeof(val));
    memset(in,0,sizeof(in));
    memset(mm,0,sizeof(mm));
}

int main()
{
    init();
    int n,m,u,v;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        mm[u][v]=mm[v][u]=1;
        in[u]++;
        in[v]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(in[i]==n-1)
            val[i]=2;//b
    }
    for(int i=1;i<=n;i++){
            if(!val[i]){
                val[i]=1;//a
                for(int j=1;j<=n;j++){
                    if(val[j]!=2&&mm[i][j])val[j]=1;
                }
                break;
            }
        }
    for(int i=1;i<=n;i++)
        if(val[i]==0)
            val[i]=3;
//    for(int i=1;i<=n;i++)
//        cout<<val[i]<<" ";
//    cout<<endl;
    int sign=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(mm[i][j]==1)//相连的
            {
                if(val[i]+val[j]==4&&val[i]!=val[j])//a与c相连
                    sign=1;
            }
            else{
               if(!((val[i]+val[j]==4)&&(val[i]!=val[j])))
                    sign=1;
            }
            if(sign)
                break;
        }
        if(sign)
            break;
    }
    if(sign)
        printf("No\n");
    else{
        printf("Yes\n");
        for(int i=1;i<=n;i++)
            printf("%c",val[i]-1+'a');
        printf("\n");
    }
    return 0;
}

#include<bits/stdc++.h>
#define PI acos(-1)
#define ll long long
#define eps 1e-9
#define PB push_back
#define EB emplace_back
#define F first
#define S second
#define MP make_pair
#define RS resize
#define BG begin
#define sf scanf
#define pf printf
#define optimize() ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define harmonic(n) 0.57721566490153286l+log(n)
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define MOD 1000000007
#define fraction() cout.unsetf(ios::floatfield); cout.precision(6); cout.setf(ios::fixed,ios::floatfield);
#define inf INT_MAX

using namespace std;

typedef vector<ll>   vli;
typedef vector<int>   vi;
typedef pair<int,int>  pii;
typedef pair<ll,ll>   pll;
typedef vector<pii>  vpi;
typedef vector<vector<int> > vvi;
typedef vector<vector<ll> > vvl;
typedef vector<pll> vpl;
typedef vector<vector<ll> > vvli;

int dx[] = {+1 , -1 , 0 , 0};
int dy[] = {0 , 0 , +1 , -1};
int dx2[] = {+1 , -1 , 0 , 0 , +1 , +1 , -1 , -1};
int dy2[] = {0 , 0 , +1 , -1 , +1 , -1 , -1 , +1};

ll squ(ll x)
{
    return (x*x);
}

ll power(ll bs,ll k)
{
    ll x = 1,y = bs;
    if(k == 0) return 1;

    while(k > 0){
        if(k % 2 == 1) x = (x * y) ;

        y *= y;
        k /= 2;
    }
    return x;
}

#define MX 600
int level[MX];
string s;

vvi g,ck;
map<pii , bool> mp;

int main()
{
    optimize();
    fraction();
    memset(level,-1,sizeof(level));

    int n,m,i,j,k,x,y,a,b;

    cin >> n >> m;
    g.RS(n + 1);
    ck.RS(4);

    for(i = 0; i < m; i++){
        cin >> a >> b;
        g[a].PB(b);
        g[b].PB(a);
        mp[pii(a,b)] = true;
        mp[pii(b,a)] = true;
    }

    for(i = 1;i <= n; i++){
        if(g[i].size() == n - 1){

            level[i - 1] = 1;
            ck[1].PB(i);
        }
    }

    for(i = 1;i <= n; i++){
        if(g[i].size() != n - 1){

            ck[0].PB(i);
            level[i - 1] = 0;
            int sz = g[i].size();
            for(j = 0 ;j < sz; j++){
                if(level[g[i][j] - 1] != 1){

                    level[g[i][j] - 1] = 0;
                    ck[0].PB(g[i][j]);
                }
            }
            break;
        }
    }

    for(i = 0; i < n ;i++){
        if(level[i] == -1){
            level[i] = 2;
            ck[2].PB(i + 1);
        }
    }

    for(i = 0 ;i < 3; i++){
        int sz2,sz1 = ck[i].size();
        for(j = i ;j < 3 && j < i + 2 ;j++){
            //if(j == i) continue;
            sz2 = ck[j].size();
            if(sz2 == 0) continue;
            for(int k = 0; k < sz1; k++){
                for(int l = 0 ; l < sz2; l++){
                    x = ck[i][k];
                    y = ck[j][l];
                    if(x == y) continue;
                    if(mp[pii(x,y)] == false){
                   //     cout << x << ' ' << y << endl;
                        cout << "No";
                        return 0;
                    }
                }
            }
        }
    }
    int sz1 = ck[0].size();
    int sz2 = ck[2].size();
    for(i=0; i < sz1;i++){
    	for(j = 0; j < sz2; j++){
    		if(mp[pii(ck[0][i],ck[2][j])] == true){
    			cout <<"No";
    			return 0;
    		}
    	}
    }
    cout << "Yes" << endl;
    for(i = 0 ;i < n; i++) { char c = ( 'a' + level[i]);
    cout << c;
    }
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <cstdlib>
#include <string>
#include <climits>
#include <map>
#include <iterator>
#include <queue>
#include <cstring>
#include <set>
#include <stack>
#include <complex>
#include <windows.h>
#define nfor(i, x, y) for (int i = x; i < y; i++)
#define rfor(i, x, y) for (int i = x - 1; i >= y; i--)
#define all(n) n.begin(), n.end()
#define rall(n) n.rbegin(), n.rend()

const long long mod = (long long)1e9 + 7;
const int maxn = (int)1e5 + 10;
long long inf = 1LL << 60;
const double eps = 1e-10;

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef map<int, int> mii;
typedef map<ll, ll> mll;
typedef map<int, bool> mib;
typedef pair<ll, ll> pll;
typedef pair<int, bool> pib;
typedef vector<vector<int>> vvi;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector <pii> vpii;

template <class N>
inline void read(N &n)
{
	N x = 0, f = 1; char ch = getchar();
	while (ch<'0' || ch>'9'){ if (ch == '-')f = -1; ch = getchar(); }
	while (ch >= '0'&&ch <= '9'){ x = 10 * x + ch - '0'; ch = getchar(); }
	n = x*f;
}

vector <int> g[600];

char ans[501];

bool used[maxn];

bool dfs(int v, char col)
{
	used[v] = 1;
	if (ans[v] == 'b')
		return true;
	if (ans[v])
		return false;
	ans[v] = col;
	for (int &to : g[v])
	{
		if (!used[to])
			if (!dfs(to, col))
				return false;
	}
	return true;
}

int main()
{
	ios_base::sync_with_stdio(0);
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	int n, m;
	cin >> n >> m;
	nfor(i, 0, m)
	{
		int u, v;
		cin >> u >> v;
		u--, v--;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	int a = 0, b = 0, c = 0;
	nfor(i, 0, n) {
		if (g[i].size() == n - 1)
			ans[i] = 'b', b++;
	}
	int cnt = 0;
	nfor(i, 0, n) {
		if (!ans[i] && cnt != - 1) {
			if (!dfs(i, 'a' + cnt))
				cout << "No", exit(0);
			if (cnt == 2) cnt = -1;
			else cnt = 2;
		}
		else if (!ans[i] && cnt == -1)
			cout << "No", exit(0);
	}
	nfor(i, 0, n) {
		if (ans[i] == 'a') a++;
		if (ans[i] == 'c') c++;
	}
	nfor(i, 0, n) {
		if (ans[i] == 'a') {
			if (g[i].size() != a + b - 1) cout << "No", exit(0);
		}
		if (ans[i] == 'c') {
			if (g[i].size() != c + b - 1) cout << "No", exit(0);
		}
	}
	cout << "Yes\n";
	nfor(i, 0, n) cout << ans[i];
	return 0;
}

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>

using namespace std;

const int maxn=505;

int edge[maxn][maxn];
char ch[maxn];
bool vis[maxn];
int in[maxn];
int n,m;

bool dfs(int u)
{
    for(int i=1;i<=n;i++)if(u!=i&&!edge[u][i])
    {
        if(!vis[i])
        {
            vis[i]=true;
            ch[i]=(ch[u]=='a'?'c':'a');
            if(!dfs(i))return false;
        }
        else if(ch[i]==ch[u])return false;
    }
    return true;
}

bool check(int u)
{
    int temp;
    for(int i=1;i<=n;i++)if(u!=i&&edge[u][i])
    {
        if(!vis[i])
        {
            vis[i]=true;
            temp=ch[u]-ch[i];
            temp=(temp>0?temp:-temp);
            if(!check(i))return false;
        }
        else
        {
            temp=ch[u]-ch[i];
            temp=(temp>0?temp:-temp);
            if(temp>1)return false;
        }
    }
    return true;
}

int main()
{
    scanf("%d%d",&n,&m);
    memset(edge,0,sizeof(edge));
    memset(in,0,sizeof(in));
    int a,b;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        edge[a][b]=true;
        edge[b][a]=true;
        in[a]++;in[b]++;
    }
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)if(in[i]==n-1)
    {
        vis[i]=true;
        ch[i]='b';
    }
    bool ok=true;
    for(int i=1;i<=n;i++)if(!vis[i])
    {
        vis[i]=true;ch[i]='a';
        if(!dfs(i)){ok=false;break;}
    }
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)if(!vis[i])
    {
        vis[i]=true;
        if(!check(i)){ok=false;break;}
    }
    if(ok)
    {
        printf("Yes\n");
        for(int i=1;i<=n;i++)
            putchar(ch[i]);
        puts("");
    }
    else printf("No\n");
    return 0;
}

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define rint register int
#ifdef DEBUG
#define debug(x) cerr << #x << " " << x << '\n'
#else
#define debug(x)
#endif
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 0x3f3f3f3f, N = 505;
inline int read()
{
    int sum = 0, f = 1;
    char c = getchar();
    while(c>'9'||c<'0') {if(c=='-') f = -f; c = getchar();}
    while(c>='0'&&c<='9') sum = sum*10 + c - 48, c = getchar();
    return sum*f;
}
int n, m, deg[N];
char ans[N];
map <int,int> p;
map <pii,bool> scc;
int main()
{
 	ios::sync_with_stdio(false);
 	cin.tie(0);
 	cin >> n >> m;
 	for(int i=1;i<=m;i++)
 	{
 		int u, v;
 		cin >> u >> v;
 		deg[u]++; deg[v]++;
 		scc[mp(u,v)] = scc[mp(v,u)] = 1;
 	}
 	for(int i=1;i<=n;i++)
 	{
 		if(deg[i]==n-1) ans[i] = 'b';
 		else p[n-1-deg[i]]++;
 	}
 	//for(auto x : p) debug(x.first), debug(x.second);
 	if(p.size()>2)  cout << "No" << '\n';
 	else
 	{
 		if(p.size()==1)
 		{
 			auto it = p.begin();
 			if(2*(*it).first==(*it).second)
 			{
 				cout << "Yes" << '\n';
 				for(int i=1;i<=n;i++)
 				{
 					if(ans[i]=='b') continue;
 					ans[i] = 'a';
 					for(int j=i+1;j<=n;j++)
 					{
 						if(ans[j]=='b') continue;
 						if(scc[mp(i,j)]||scc[mp(j,i)]) ans[j] = 'a';
 						else ans[j] = 'c';
  					}
 					break;
 				}
 				for(int i=1;i<=n;i++) cout << ans[i];
 				cout << '\n';
 			}
 			else cout << "No" << '\n';
 		}
 		else if(p.size()==2)
 		{
 			auto it = p.begin(), it2 = --p.end();
 			//debug((*it).first); debug((*it2).second); debug((*it).second); debug((*it2).first);
 			if((*it).first==(*it2).second&&(*it).second==(*it2).first)
 			{
 				cout << "Yes" << '\n';
 				for(int i=1;i<=n;i++)
 				{
 					if(ans[i]=='b') continue;
 					if(n-1-deg[i]==(*it).first) ans[i] = 'a';
 					else ans[i] = 'c';
 				}
 				for(int i=1;i<=n;i++) cout << ans[i];
 				cout << '\n';
 			}
 			else cout << "No" << '\n';
 		}
 		else
 		{
 			cout << "Yes" << '\n';
 			for(int i=1;i<=n;i++) cout << ans[i];
 			cout << '\n';
 		}
 	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 1000000007
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define ALL(x) x.begin(), x.end()

int main(int argc, char const *argv[])
{
	bool adj[505][505] = {false};
	int degrees[505] = {0};
	int n,m;
	cin >> n >> m;
	vector<char> ans(n,'@');
	for(int i = 0 ; i < m ; i++){
		int a,b;
		cin >> a >> b;
		adj[a][b] = adj[b][a] = true;
		degrees[a]++; degrees[b]++;
	}
	for(int i = 1 ;i <= n ; i++)
		if(degrees[i] == n-1)
			ans[i-1] = 'b';
	for(int i = 1 ; i <= n ; i++){
		if(degrees[i] == n-1)
			continue;
		else{
			if(ans[i-1] == '@')
				ans[i-1] = 'a';
			for(int j = 1 ; j <= n; j++){
				if(i == j) continue;
				char tmp = ans[j-1];
				if(tmp == 'b') continue;
				if(adj[i][j])
					ans[j-1] = ans[i-1]=='a'?'a':'c';
				else
					ans[j-1] = ans[i-1]=='a'?'c':'a';
				if(tmp!=ans[j-1] && tmp!='@'){
					cout << "No\n";;
					return 0;
				}
			}
		}
	}
	cout << "Yes\n";
	for(int i = 0 ; i < n; i++)
		cout << ans[i];
	return 0;
}

#include <bits/stdc++.h>

#define N 1010

using namespace std;

int n,col[N],ind[N];
bool g[N][N];
char ans[N];

bool dfs(int x)
{
//	cout<<col[x]<<endl;
	for(int i=1;i<=n;i++)
	{
		if(g[x][i]) continue;
		if(!col[i])
		{
			col[i] = -col[x];
			if(!dfs(i)) return 0;
		}
		else if(col[i]==col[x]) return 0;
	}
	return 1;
}

int main()
{
	int m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) g[i][i] = 1, ind[i]=1;
	for(int i=1,x,y;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		g[x][y] = g[y][x] = 1;
		ind[x]++;
		ind[y]++;
	}
	for(int i=1;i<=n;i++)
		if(!col[i] && ind[i]<n)
		{
			col[i]=1;
			if(!dfs(i))
			{
				puts("No");
				return 0;
			}
		}
	for(int i=1;i<=n;i++) ans[i] = col[i]==1? 'a':'c';
	for(int i=1;i<=n;i++) if(ind[i]==n) ans[i]='b';
	for(int i=1;i<=n;i++)
	{
		if(ans[i]=='a')
		{
			for(int j=1;j<=n;j++)
				if(ans[j]=='c' && g[i][j])
				{
					puts("No");
					return 0;
				}
		}
		else if(ans[i]=='c')
		{
			for(int j=1;j<=n;j++)
				if(ans[j]=='a' && g[i][j])
				{
					puts("No");
					return 0;
				}
		}
	}
	puts("Yes");
	for(int i=1;i<=n;i++) putchar(ans[i]);
	putchar('\n');
	return 0;
}

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

int a[501][501];

vector<vector<int>> g;
string s;

void dfs(int v, char color = 'a', int p = -1) {
    if (g[v].empty()) return;
    s[v] = color;
    char nc = color == 'a' ? 'c' : 'a';
    for (int i : g[v]) {
        if (i == p) continue;
        if (s[i] == color) {
            cout << "No\n";
            exit(0);
        }
        if (s[i] == 'b') dfs(i, nc, v);
    }
}

signed main() {
    ios::sync_with_stdio(false);
    //cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    g.resize(n);
    set<pair<int, int>> check;
    for (int i = 0; i < n; ++i) s += 'b';
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        check.insert({min(u, v) - 1, max(u, v) - 1});
        a[u - 1][v - 1] = a[v - 1][u - 1] = 1;
    }
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            if (a[i][j] == 0) {
                g[i].push_back(j);
                g[j].push_back(i);
            }
        }
    }
    for (int i = 0; i < n; ++i) if (s[i] == 'b') dfs(i);
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            if (abs(s[i] - s[j]) <= 1) {
                auto now = check.find({i, j});
                if (now == check.end()) {
                    cout << "No\n";
                    return 0;
                }
                check.erase(now);
            }
        }
    }
    if (!check.empty()) {
        cout << "No\n";
        return 0;
    }
    cout << "Yes\n";
    cout << s << endl;
    return 0;
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>

#define pb push_back
#define mp make_pair
#define LL long long
#define LD long double
#define maxlongint 2147483647

using namespace std;

const int inf = 999999999;
const int mod = 1000000007;

inline int Getint()
{
	char ch = getchar();
	while (ch < '0' || ch > '9') ch = getchar();
	int ret = 0;
	while (ch >= '0' && ch <= '9') ret = ret * 10 + ch - '0', ch = getchar();
	return ret;
}

int color[510];
bool g[510][510];
bool flag;
int n, m, x, y;

void Dfs(int node, int cc)
{
	//printf("node, cc = %d %d\n", node, cc);
	if (color[node])
	{
		if (color[node] != cc) flag = false;
		return;
	}
	color[node] = cc;
	for (int i = 1; i <= n; i++)
	{
		if (node != i && !g[node][i])
		{
			Dfs(i, 4 - cc);
		}
		if (!flag) return;
	}
}

int main()
{
	n = Getint(), m = Getint();
	for (int i = 1; i <= m; i++)
	{
		x = Getint(), y = Getint();
		g[x][y] = g[y][x] = true;
	}

	flag = true;
	for (int i = 1; i <= n; i++)
	{
		if (!color[i])
		{
			int tot = 0;
			for (int j = 1; j <= n; j++)
			{
				tot += g[i][j];
			}
			if (tot != n - 1) Dfs(i, 1);
		}
		if (!flag) break;
	}
	if (!flag)
	{
		puts("No");
		return 0;
	}
	for (int i = 1; i <= n; i++)
	{
		if (!color[i]) color[i] = 2;
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (i != j)
			{
				if ((g[i][j] && abs(color[i] - color[j]) > 1) || (!g[i][j] && abs(color[i] - color[j]) < 2))
				{
					puts("No");
					return 0;
				}
			}
	puts("Yes");
	for (int i = 1; i <= n; i++)
	{
		printf("%c", color[i] + 96);
	}
	puts("");
	return 0;
}

///A drunk man will find his way home, but a drunk bird may get lost forever...
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef double dd;
typedef pair <int, int> pii;
#define pb push_back
#define pf push_front
#define f first
#define s second
#define sz(x) (int)x.size()
#define smin(x , y) x = min(x , y)
#define smax(x , y) x = max(x , y)
#define mp make_pair
const int mx = 505;
vector < int > ad[mx];
bool mark[mx];
char ans[mx];
int t1;
void dfs(int v, char c){
	t1++;
	mark[v] = 1;
	ans[v] = c;
	for(auto u : ad[v]){
		if(!mark[u])
			dfs(u , c);
	}
	return;
}
int32_t main(){
	ios_base::sync_with_stdio(false);
    cin.tie(0);
	cout.tie(0);
	int n, m, u, v;
	cin >> n >> m;
	for(int i = 0; i < m; i++){
		cin >> u >> v;
		u--, v--;
		ad[u].pb(v);
		ad[v].pb(u);
	}
	int x = -1, t = 0, e = 0;
	for(int i = 0; i < n; i++){
		if(sz(ad[i]) == n - 1){
			ans[i] = 'b';
			mark[i] = 1;
			t++;
		}
		else
			x = i;
	}
	if(x == -1){
		cout << "YES" << endl;
		for(int i = 0; i < n; i++)
			cout << "b";
		cout << endl;
		return 0;
	}
//	cout << "t " << t << endl;
//	cout << "x " << x << endl;
	e += t * (n - 1);
	dfs(x , 'a');
	e += t1 * (t + t1 - 1);
	for(int i = 0; i < n; i++)
		if(!mark[i]){
			t1 = 0;
			dfs(i , 'c');
			e += t1 * (t + t1 - 1);
			break;
		}
	for(int i = 0; i < n; i++)
		if(!mark[i]){
			cout << "NO" << endl;
			return 0;
		}
	t1 = 0;
	if(e / 2 != m){
		cout << "NO" << endl;
		return 0;
	}
	cout << "YES" << endl;
	for(int i = 0; i < n; i++)
		cout << ans[i];
	cout << endl;
	return 0;
}

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <queue>

using namespace std;

vector<set<int>> g;

int main()
{
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	int n, m; cin >> n >> m;
	g.resize(n);

	for (int i = 0; i < m; i++)
	{
		int u, v;
		cin >> u >> v;
		u--, v--;
		g[u].insert(v), g[v].insert(u);
	}

	vector<int> col(n);

	for (int i = 0; i < n; i++)
		if (g[i].size() == (n - 1))
			col[i] = 1;

	int k = -1;
	for (int i = 0; i < n; i++)
		if (!col[i])
		{
			col[i] = 2;
			k = i;
			break;
		}

	if (k != -1)
		for (set<int>::iterator it = g[k].begin(); it != g[k].end(); it++)
			if (!col[*it])
				col[*it] = 2;

	k = -1;
	for (int i = 0; i < n; i++)
		if (!col[i])
		{
			col[i] = 3;
			k = i;
		}

	if (k != -1)
		for (set<int>::iterator it = g[k].begin(); it != g[k].end(); it++)
			if (!col[*it])
				col[*it] = 3;

	for (int i = 0; i < n; i++)
	{
		if (!col[i])
			return !(cout << "No" << endl);
		if (col[i] == 1)
			continue;
		for (set<int>::iterator it = g[i].begin(); it != g[i].end(); it++)
			if (col[*it] != 1 && col[*it] != col[i])
				return !(cout << "No" << endl);

		for (int j = 0; j < n; j++)
			if (col[i] == col[j] && i != j)
				if (g[i].find(j) == g[i].end())
					return !(cout << "No" << endl);
	}

	cout << "Yes" << endl;
	for (int i = 0; i < n; i++)
	{
		if (col[i] == 1)
			cout << 'b';
		else if (col[i] == 2)
			cout << 'a';
		else if (col[i] == 3)
			cout << 'c';
	}
	return !(cout << endl);
}

#include<bits/stdc++.h>
using namespace std;
///////////////////////////////////Nikhil Srivastava////////////////////////////////////////
///////////////////////////////////IIT Jodhpur//////////////////////////////////////////////
///////////////////////////////////Bazinga//////////////////////////////////////////////////
#define SPEED ios::sync_with_stdio(false); cin.tie(0)
#define sci(a) scanf("%d",&a)
#define scl(a) scanf("%I64d",&a)
#define scc(a) scanf("%c",&a)
#define scf(a) scanf("%f",&a)
#define scd(a) scanf("%lf",&a)
#define scs(a) scanf("%s",&a)
#define printi(x) printf("%d\n",x)
#define printl(x) printf("%lld\n",x)
#define loop(i,a,n) for(int i=a;i<n;++i)
#define loopd(i,a,n) for(int i=a;i>=n;--i)
#define nl printf("\n");
#define ll long long int
#define ld long double
#define mp(a,b) make_pair(a,b)
#define all(x) x.begin(),x.end()
#define pi pair < int,int >
#define pl pair < ll,ll >
#define pb push_back
#define maxi 100005
#define MOD (1000000007LL)
#define INF 1e18
#define MAXI 1000005
#define ff first
#define ss second
static int rowNbr[] = {-1, -1, -1,  0, 0,  1, 1, 1};
static int colNbr[] = {-1,  0,  1, -1, 1, -1, 0, 1};
ll power(ll base, ll p){
ll ans = 1;while(p){if(p&1)ans=(ans*base);base=(base*base);p/=2;}return ans;
}

ll modPower(ll base, ll p, ll mod = MOD){
ll ans = 1;while(p){if(p&1)ans=(ans*base)%mod;base=(base*base)%mod;p/=2;}return ans;
}

ll gcd(ll a, ll b){
    if(b == 0)  return a;
    return gcd(b, a%b);
}
/////////////////////////////////////////////Solution From Here//////////////////////////////////////////////////////////

vector<int> adj[maxi];
bool vis[maxi],vis1[maxi];
int color[maxi];
int deg[maxi];

void label(int s) /// called only for unlabelled vertices
{
    vis[s] = 1;
    color[s] = 1;
    deque<int> q;
    q.pb(s);
    while(!q.empty()) {
        int u =q.front();
        q.pop_front();
        loop(i,0,adj[u].size()) {
            if(!vis[adj[u][i]]) {
                vis[adj[u][i]]  = 1;
                if(color[adj[u][i]]!=0)
                    continue;
                color[adj[u][i]] = 1;
                q.pb(adj[u][i]);
                }
            }
        }
}

int main()
{
    SPEED;

                            int n,m;
                            cin>>n>>m;

                            loop(i,0,m) {
                                    int u,v;
                                    cin>>u>>v;
                                    adj[u].pb(v);
                                    adj[v].pb(u);
                                    deg[u]++;
                                    deg[v]++;
                            }

                            loop(i,1,n+1) {

                                    if(deg[i] == n-1) {
                                                color[i] = 2;
                                    }
                            }
                            loop(i,1,n+1) {
                                        if(color[i] == 0) {
                                                    label(i);
                                                                break;
                                }
                            }
                            loop(i,1,n+1) {
                                        if(color[i] == 0)
                                                    color[i] = 3;
                            }
                            loop(i,1,n+1) {
                                sort(all(adj[i]));
                            }
                            loop(i,1,n+1) {
                                    if(color[i] == 1) {
                                        loop(j,1,n+1) {
                                                if(j == i)
                                                        continue;
                                                                if(color[j]==1){
                                                                        if(binary_search(all(adj[i]),j) == false)
                                                                                {
                                                                                cout<<"No";
                                                                                return 0;
                                                                                }
                                    }
                                    else if(color[j] == 2) {
                                        if(binary_search(all(adj[i]),j) == false)
                                                        {
                                                            cout<<"No";
                                                            return 0;
                                                        }
                                    }
                                }
                                }
                                else if(color[i] == 3) {
                                    loop(j,1,n+1) {
                                        if(j == i)
                                            continue;
                                        if(color[j]==3){
                                                if(binary_search(all(adj[i]),j) == false)
                                                        {
                                                            cout<<"No";
                                                            return 0;
                                                        }
                                    }
                                    else if(color[j] == 2) {
                                        if(binary_search(all(adj[i]),j) == false)
                                                        {
                                                            cout<<"No";
                                                            return 0;
                                                        }
                                    }
                                }

                            }
                            }

                            cout<<"Yes"<<endl;
                            loop(i,1,n+1) {
                                if(color[i]==1)
                                    cout<<"a";
                                if(color[i]==2)
                                    cout<<"b";
                                if(color[i]==3)
                                    cout<<"c";
                            }

}

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

typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<int, ii> ipii;
typedef pair<ii, int> piii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<ipii> vipii;
typedef vector<piii> vpiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
typedef map<int, int> mpii;
typedef unordered_map<int, int> umpii;

#define sab(v) v.begin(), v.end()
#define upb(v, key) (upper_bound(sab(v), key) - v.begin())
#define lob(v, key) (lower_bound(sab(v), key) - v.begin())

int inf = 1e9;
int INF = inf * inf;
int mod = 1e9 + 7;
double eps = 1e-9;
const ld pi = ld(3.1415926535897932384626433832795);
int dr[] = {-1, 0, 0, 1};
int dc[] = {0, 1, -1, 0};

void mod_add(int &a, int b) {
  a += b;
  if(a >= mod) a -= mod;
}
void mod_sub(int &a, int b) {
  a -= b;
  if(a < 0) a += mod;
}
int mod_pow(int b, int p) {
  int res = 1;
  while(p) {
    if(p & 1) {
      res = res * b % mod;
    }
    p >>= 1;
    b = b * b % mod;
  }
  return res;
}

template<class TH> void _dbg(const char *sdbg, TH h) { cerr<<sdbg<<'='<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')cerr<<*sdbg++;
  cerr<<'='<<h<<','; _dbg(sdbg+1, a...);
}
template<class T> ostream &operator<<(ostream& os, vector<T> V) {
  os << "["; for (auto vv : V) os << vv << ","; return os << "]";
}
template<class L, class R> ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)

/*...................................................*/

main() {
  ios::sync_with_stdio(false), cin.tie(0);
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);

  int t = 1, n, m, i, j, k, u, to;
  // cin >> t;
  // int tc = t;
  while (t--) {
    // cout << "Case #" << tc - t << ": ";
		cin >> n >> m;
    vvi g(n, vi(n));
    vi a(n, -1);
    for(i = 0; i < m; i++) {
      cin >> u >> to;
      u--, to--;
      g[u][to] = g[to][u] = 1;
    }
    for(i = 0; i < n; i++) {
      int deg = 0;
      for(j = 0; j < n; j++) {
        deg += g[i][j];
      }
      if(deg == n - 1) {
        a[i] = 1;
      }
    }
    queue<int> q;
    for(i = 0; i < n; i++) {
      if(a[i] == -1) {
        q.push(i);
        a[i] = 0;
        while(!q.empty()) {
          u = q.front(); q.pop();
          for(to = 0; to < n; to++) {
            if(a[to] == -1 && !g[u][to]) {
              q.push(to);
              a[to] = a[u] ^ 2;
            } else if(to != u && a[to] == a[u] && !g[u][to]) {
              cout << "No";
              return 0;
            }
          }
        }
      }
    }
    bool f = 1;
    for(i = 0; f && i < n; i++) {
      for(j = 0; f && j < n; j++) {
        if(j != i && a[i] == a[j] && !g[i][j]) {
          f = 0;
        }
        if(j != i && a[i] != a[j] && g[i][j] && a[i] != 1 && a[j] != 1) {
          f = 0;
        }
      }
    }
    if(!f) {
      cout << "No";
      return 0;
    }
    cout << "Yes\n";
    for(auto it: a) {
      cout << char('a' + it);
    }
  }
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <stack>
#include <bitset>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include<queue>
#include<vector>
using namespace std;
int ans[510],n,m;
vector<int>arr[510];
bool book[510][510];
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		book[i][i] = 1;
	for (int i = 1; i <= m; i++)
	{
		int a, b;
		cin >> a >> b;
		arr[a].push_back(b);
		arr[b].push_back(a);
		book[a][b] = 1;
		book[b][a] = 1;
	}
	for (int i = 1; i <= n; i++)
	{
		if (arr[i].size() == n - 1)
			ans[i] = 2;
	}
	int shu = 0;
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] == 0)
		{
			if (shu == 0)
			{
				ans[i] = 1;
				for (int j = 0; j < arr[i].size(); j++)
				{
					int temp = arr[i][j];
					if (!ans[temp])
						ans[temp] = 1;
				}
				shu++;
			}
			else if (shu == 1)
			{
				ans[i] = 3;
				for (int j = 0; j < arr[i].size(); j++)
				{
					int temp = arr[i][j];
					if (!ans[temp])
						ans[temp] = 3;
					else if (ans[temp] == 1)
					{
						shu=3;
						break;
					}
				}
				shu++;
			}
			else
			{
				shu=3;
				break;
			}
		}
	}
	for (int i = 1; i <= n; i++)
	{
		if (shu > 2)
			break;
		if (ans[i] != 2)
		{
			for (int j = 1; j <= n; j++)
			{
				if (ans[i] == ans[j])
				{
					if (!book[i][j])
					{
						shu = 3;
						break;
					}
				}
				else if (ans[j]!=2&&book[i][j])
				{
					shu = 3; break;
				}
			}
		}
	}
	if (shu > 2)
		cout << "No" << endl;
	else
	{
		cout << "Yes" << endl;
		for (int i = 1; i <= n; i++)
			printf("%c", ans[i] - 1 + 'a');
		cout << endl;
	}
	return 0;
}

#include <iostream>
#include <algorithm>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
using namespace std;

#define F first
#define S second
#define int long long

int n, m;
char used[1000];
int s[1000];
int v[1000][1000];
main() {

    cin >> n >> m;
    for(int i = 1; i <= m; ++i) {
        int x, y;
        cin >> x >> y;
        v[x][y] = 1; ++s[x];
        v[y][x] = 1; ++s[y];
    }

    for(int i = 1; i <= n; ++i) {
        if(s[i] == n - 1) {
            used[i] = 'b';
        }
    }

    for(int i = 1; i <= n; ++i) {
        if(used[i] == 'b') continue;

        if(!used[i]) used[i] = 'a';

        for(int j = 1; j <= n; ++j) {
            if(i == j) continue;

            if(v[i][j] == 1) {
                if(used[j] != 'b') {
                    if(used[i] != used[j] && used[j]) {
                        cout << "NO";
                        return 0;
                    }
                    used[j] = used[i];
                }
            }
            else {
                if(used[i] == used[j]) {
                    cout << "No";
                    return 0;
                }
                if(used[i] == 'a')
                    used[j] = 'c';
                else
                    used[j] = 'a';
            }
        }

    }
    cout << "Yes" << endl;
    for(int i = 1; i <= n; ++i)
        cout << used[i];

    return 0;
}

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,i,j,k,x,y;
bool g[510][510],isb[510],bo,isa[510];
void search(int x)
{
	isa[x]=1;
	for(int i=1;i<=n;i++)
		if(g[x][i]&&!isb[i]&&!isa[i])search(i);
}
int main()
{
	scanf("%d%d",&n,&m);
	while(m--)
	{
		scanf("%d%d",&x,&y);
		g[x][y]=g[y][x]=1;
	}
	for(i=1;i<=n;i++)
	{
		bo=1;
		for(j=1;j<=n;j++)
			if(i!=j&&!g[i][j])
			{
				bo=0;
				break;
			}
		if(bo)isb[i]=1;
	}
	for(i=1;i<=n;i++)
		if(!isb[i])
		{
			search(i);
			bo=1;
			for(j=1;j<=n;j++)
				if(isa[j])
				for(k=1;k<=n;k++)
					if(isa[k]&&j!=k&&!g[j][k])bo=0;
			if(!bo)
			{
				cout<<"No"<<endl;
				return 0;
			}
			break;
		}
	bo=1;
	for(i=1;i<=n;i++)
		if(!isb[i]&&!isa[i])
		for(j=1;j<=n;j++)
			if(!isb[j]&&!isa[j]&&i!=j&&!g[i][j])bo=0;
	if(!bo)
	{
		cout<<"No"<<endl;
		return 0;
	}
	cout<<"Yes"<<endl;
	for(i=1;i<=n;i++)
		if(isa[i])cout<<"a";else
		if(isb[i])cout<<"b";else cout<<"c";
}

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>
#include <algorithm>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <memory.h>
typedef long long ll;

using namespace std;

const int MAX = 510;
int n, m;
int M[MAX][MAX];
int str[MAX];
bool res;

int main()
{

	scanf("%d %d", &n, &m);
	memset(M, 0, sizeof(M));
	memset(str, 0, sizeof(str));
	res = true;

	int u, v;
	for(int i = 0; i < m; i++) {
		scanf("%d %d", &u, &v);
		M[u-1][v-1] = M[v-1][u-1] = 1;
	}

	v = -1;

	for(int i = 0; i < n; i++) {
		bool found = false;
		for(int j = 0; j < n; j++)
		if(i!=j)
		{
			if(M[i][j] == 0)
			{
				found = true;
				if(v == -1)
				{
					v = i;
					str[v] = 1;
				}
				break;
			}
		}
		if(found == false) str[i] = 3;
	}

	if(v!=-1)
	for(int i = 0; i < n; i++)
		if(str[i] == 0)
		{
			if(M[i][v] == 1) str[i] = 1;
			else str[i] = 2;
		}

	for(int i = 0; i < n && res; i++)
	{
		if(str[i] != 3)
			for(int j = 0; j < n && res; j++)
				if(str[j] != 3 && i != j)
					if(M[i][j] && str[i] != str[j] ||
						M[i][j] == 0 && str[i] == str[j])
						res = false;
	}

	if(res) {
		printf("Yes\n");
		for(int i = 0; i < n; i++)
		{
			if(str[i] == 1) printf("a");
			else if(str[i] == 2) printf("c");
			else if(str[i] == 3) printf("b");
		}
		printf("\n");
	} else printf("No\n");

	return 0;
}

// Author : SAGORIKA DAS
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<utility>
#include<stack>
#include<queue>
#include<list>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<string>
#define ull unsigned long long
#define ll long long
#define F first
#define S second
#define MOD 1000000007
#define inf 1000000006
#define pb push_back
#define MAX 555
#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define mp make_pair
#define CLEAR(a) memset(a,0,sizeof a)
#define pii pair< int , int >
#define piii pair< int , pii >
#define piiii pair< int, piii >
#define scan(x) scanf("%d",&x)
using namespace std;
vector<int> adj[MAX];
char str[MAX];
int mat[MAX][MAX];

int main()
{
	int n,m,u,v;
	REP(i,MAX) str[i] = '#';
	memset(mat,0,sizeof mat);
	cin>> n>> m;
	REP(i,m){
    cin >> u >> v;
     adj[u].pb(v); adj[v].pb(u);
     mat[u][v] = mat[v][u] = 1;
    }

    FOR(i,1,n+1){
    if(adj[i].size()==n-1) str[i] = 'b';
    }

    int idx = -1;
    FOR(i,1,n+1){
    if(str[i]!='b') {
        idx = i;
        break;
        }
    }

    if(idx!=-1){
    str[idx] ='a';
    for(int i=0;i<adj[idx].size();i++)
    {
            if(str[ adj[idx][i] ]!='b') str[ adj[idx][i] ] = 'a';
            }
    }

    idx = -1;
    FOR(i,1,MAX){
    if(str[i]!='b'&&str[i]!='a') {
        idx = i;
        break;
        }
    }

    if(idx!=-1){
    str[idx] ='c';
    for(int i=0;i<adj[idx].size();i++)
    {
            if(str[adj[idx][i]]!='b') str[adj[idx][i]] = 'c';
            }
    }

    bool flag = true;
    FOR(i,1,n+1) if(str[i] == '#') {flag = false;break;}

    FOR(i,1,n+1){
            if(flag == false) break;

            if(str[i] == 'a'){

            for(int j=0;j<adj[i].size();j++){
            if(str[adj[i][j]] == 'c'){
                              flag = false;
                              break;
               }
            }

            FOR(j,1,n+1){
            if(  i == j ) continue;
            if(str[j] == 'a' && mat[i][j] != 1) {flag = false; break;}
            }

            }

            if(str[i] == 'c'){
            for(int j=0;j<adj[i].size();j++){
            if(str[adj[i][j]] == 'a'){
                              flag = false;
                              break;
               }
            }
            FOR(j,1,n+1){
            if(  i == j ) continue;
            if(str[j] == 'c' && mat[i][j] != 1) {flag = false; break;}
            }

            }

}
            if(flag == false) cout<<"No";
            else{
                 cout<<"Yes\n";
                 FOR(i,1,n+1) cout<< str[i];
                 }

   	return 0;
}

# include <iostream>
# include <math.h>
# include <fstream>
# include <vector>
# include <algorithm>
# include <string>
#include <cmath>
# include <set>
using namespace std;

# define all(a) a.begin(), a.end()
# define Sort(a) sort(all(a));
# define pause system("pause");
# define ll long long
# define VI vector <int>
# define vll vector <ll>
# define pb push_back
# define pob pop_back

int g[505][505];
int n, m;

bool isit( VI x , VI y )
{
	int t1=x.size(), t2=y.size() ;
	if( m != ( ( ( n*(n-1) )/ 2 ) - t1*t2 ) ) return false;

	for(int i=0; i<t1; ++i)
		for(int j=0; j<t2; ++j)
			if( x[i]==y[j] || g [ x[i] ][ y[j] ] ) return false;

	return true;
}

int main()
{
	VI x(0);
	VI y(0);
	string ans="";

	cin>>n>>m;

	int v, u;

	for(int i=0; i<m; ++i)
	{
		scanf("%d%d", &v, &u);

		g[u][v]=1;
		g[v][u]=1;
	}

	if( m ==( n*(n-1) )/ 2 )
	{
		printf("Yes\n");
		for(int i=0; i<n; ++i) printf("b");
		printf("\n");

		return 0;
	}

	for(int i=1; i<=n; ++i)
		for(int j=1; j<=n; ++j)
			if( i!=j && g[i][j] == 0 )
			{

				for(int t=1; t<=n; ++t)
				{
					if( t!=i && g[i][t]!=1 ) x.pb(t);
					if( t!=j && g[j][t]!=1 ) y.pb(t);
				}

				if( !isit(x, y) ) { printf("No\n"); return 0; }

				for(int k=0; k<n; ++k) ans+='b';

				for(int k=0; k<x.size(); ++k)
					ans[ x[k] -1 ] = 'a';

				for(int k=0; k<y.size(); ++k)
					ans[ y[k] -1 ] = 'c';

					printf("Yes\n");
					cout<<ans<<endl;

					return 0;
			}

}

#include<bits/stdc++.h>
#define _ 0
using namespace std;
inline int read(){
    int x=0,f=0;char ch=getchar();
    while(!isdigit(ch))f|=ch=='-',ch=getchar();
    while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
    return f?-x:x;
}
int head[507],cnt;
struct Edge{
    int next,to;
}edge[500007];
bool ma[507][507];
int col[507];
inline void Byebye(){printf("No\n");exit( ~~(0^_^0) );}
inline void add_edge(int from,int to){
    edge[++cnt].next=head[from];
    edge[cnt].to=to;head[from]=cnt;
}
bool dfs(int x){
    for(int i=head[x];i;i=edge[i].next){
        int to=edge[i].to;
        if(col[to]==col[x])return 0;
        if(~col[to])continue;col[to]=col[x]^1;
        if(!dfs(to))return 0;
    }
    return 1;
}
int main(){
    int n=read(),m=read();
    for(int i=1;i<=m;++i){
        int u=read(),v=read();
        ma[u][v]=ma[v][u]=1;
    }
    for(int i=1;i<=n;++i)for(int j=1;j<i;++j)
        if(!ma[i][j])add_edge(i,j),add_edge(j,i);
    memset(col,-1,sizeof col);
    for(int i=1;i<=n;++i){
        if(~col[i] || !head[i])continue;
        col[i]=0;
        if(!dfs(i))Byebye();
    }
    for(int i=1;i<=n;++i)for(int j=1;j<i;++j)
        if(ma[i][j] && col[i]+col[j]==1)Byebye();
    printf("Yes\n");
    for(int i=1;i<=n;++i)putchar(~col[i]?!col[i]?'a':'c':'b');
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ull unsigned long long int
#define rep(i,a,b) for (ll i = a; i <= b; i++)
#define ren(i,a,b) for(ll i=b;i>=a;i--)
#define F first
#define S second
#define PB push_back
#define DB pop_back
#define MP make_pair
#define MT make_tuple
#define G(a,b) get<a>(b)
#define V(a) vector<a>
#define MOD 1000000007
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
ll powM(ll x,ll y,ll m)
{
    if(y==0) return 1;
    ll p=powM(x,y/2,m)%m;
    p=(p*p)%m;
    return (y%2==0)?p:(x*p)%m;
}
////////////////////

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    /*int t;
    cin>>t;
    while(t--)*/
    vector<int> v[501];
    set<pair<int,int>> pr;
    int n,m;
    cin>>n>>m;
    rep(i,1,m){
        int a,b;
        cin>>a>>b;
        v[a].PB(b);
        v[b].PB(a);
        pr.insert({a,b});
        pr.insert({b,a});
    }
    int fl=1;
    string s(n+1,'.');
    rep(i,1,n){
        if((int)v[i].size()==n-1) s[i]='b';
    }
    rep(i,1,n){
        if(s[i]=='.')
        {
            s[i]='a';
            for(auto u:v[i]){
                if(s[u]=='.') s[u]='a';
            }
            break;
        }
    }
    rep(i,1,n){
        if(s[i]=='.')
        {
            s[i]='c';
            for(auto u:v[i]){
                if(s[u]=='.') s[u]='c';
                if(s[u]=='a'){
                    fl=0;
                    break;
                }
            }
            break;
        }
    }
    rep(i,1,n){
        if(s[i]=='.'){
            fl=0;
            break;
        }
    }
    if(fl==0){
        cout<<"No"<<'\n';
        return 0;
    }
    rep(i,1,n)
    {
        rep(j,1,n){
            if(i==j) continue;
            if(s[i]==s[j]){
                if(!pr.count({i,j})){
                    fl=0;
                    break;
                }
            }
            else if(s[i]!='b'&&s[j]!='b'){
                if(pr.count({i,j})){
                    fl=0;
                    break;
                }
            }
        }
        if(fl==0) break;
    }
    if(fl==0){
        cout<<"No"<<'\n';
        return 0;
    }
    cout<<"Yes"<<'\n';
    rep(i,1,n) cout<<s[i];
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int graph[n+1][n+1],mgraph[n+1][n+1];int x,y;
	int check[n+1];int assign[n+1];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			graph[i][j]=1;mgraph[i][j]=0;
		}
		graph[i][i]=0;check[i]=0;assign[i]=-1;
	}
	for(int ii=1;ii<=m;ii++)
	{
		cin>>x>>y;
		graph[x][y]=0;graph[y][x]=0;
		mgraph[x][y]=1;mgraph[y][x]=1;

	}
	for(int ip=1;ip<=n;ip++)
	{
		if(check[ip]==0)
		{
			assign[ip]=1;
			queue<int> q;
			q.push(ip);
			check[ip]=1;
			while(!q.empty())
			{
				int x=q.front();
				int y=assign[x];
				q.pop();
				int t=0;
				for(int i=1;i<=n;i++)
				{
					if(check[i]==0 && graph[x][i]==1 )
					{
						t=1;
						if(assign[i]==-1){
							assign[i]=4-y;
						}
						//else if(assign[i]==4-y)continue;
						else if(assign[i]!=(4-y)){cout<<"No";return 0;}
						q.push(i);
						check[i]=1;
					}
					else if(check[i]==1 && graph[x][i]==1)
					{
						t=1;
						if(assign[i]!= (4-y)){cout<<"No";return 0;}
					}
					/*else if(graph[i][x]==0)
					{
						if(assign[i]==-1 || assign[i]==2){continue;}
						else if(assign[i]==(4-y) && assign[i]!=2){cout<<"No";return 0;}
					}*/
				}
				if(t==0)assign[x]=2;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(assign[i]==2){continue;}
		for(int j=1;j<=n;j++)
		{
			if(mgraph[i][j]==1 && assign[i]+assign[j]==4){cout<<"No";return 0;}
		}
	}
	cout<<"Yes"<<endl;
	for(int i=1;i<=n;i++)
	{
		if(assign[i]==1)cout<<'a';
		else if(assign[i]==3)cout<<'c';
		else if(assign[i]==2)cout<<'b';
	}
}

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define lim 3000
vector<ll>a[500+1];
ll n,m;
queue<ll>q1;
char ans[500+1];
void dobfs(ll i,char q)
{ int k1=a[i].size();
       ans[i]=q;
    for(int j=0;j<k1;j++)
    {   //cout<<"kl";
        if(ans[a[i][j]]=='x')
        {  //cout<<i<<" hh "<<j<<endl;
            ans[a[i][j]]=q;
        }
    }
  return;
}
int main()
{
    //freopen("input.txt","r",stdin);
    cin>>n>>m;
    ll x,y;

    for(ll i=1;i<=n;i++)
        ans[i]='x';
    for(ll i=1;i<=m;i++)
    {
        cin>>x>>y;
        a[x].pb(y);
        a[y].pb(x);
    }
    for(ll i=1;i<=n;i++)
    {
        if(a[i].size()==n-1)
        {
            ans[i]='b';
        }
    }
    for(ll i=1;i<=n;i++)
    {
        if(ans[i]=='x')
        {
            dobfs(i,'a');
            break;
        }
    }
    for(ll i=1;i<=n;i++)
    {
        if(ans[i]=='x')
        {
            dobfs(i,'c');
            break;
        }
    }
    for(ll i=1;i<=n;i++)
    {   // cout<<i<<" here "<<ans[i]<<endl;
        if(ans[i]=='x')
        {
            cout<<"No"<<endl;
            return 0;
        }
    }
    int a1=0,b1=0,c1=0;
    for(int i=1;i<=n;i++)
    {
       if(ans[i]=='a')
        a1++;
       else if(ans[i]=='b')
        b1++;
    else c1++;
    }

    //cout<<a1<<" "<<b1<<" "<<c1<<" khnj, "<<endl;
    ll ea=(a1-1+b1),eb=(b1-1+a1+c1),ec=(c1-1+b1);
    //cout<<edges<<"   k "<<m<<endl;
    bool pop=false;
    for(int i=1;i<=n;i++)
    {
        if(ans[i]=='a'&&a[i].size()!=ea)
        {
            pop=true;
            break;
        }
         if(ans[i]=='b'&&a[i].size()!=eb)
        {
            pop=true;
            break;
        }
         if(ans[i]=='c'&&a[i].size()!=ec)
        {
            pop=true;
            break;
        }
    }
    if(pop)
    {
        cout<<"No"<<endl;
            return 0;
    }
    cout<<"Yes"<<endl;
    for(ll i=1;i<=n;i++)
        cout<<ans[i];

}

/*************************************************************************
	> File Name: C.cc
	> Author: yuzhou627
	> Mail:   yuzhou627@gmail.com
	> created Time: Fri 05 Feb 2016 01:21:09 AM CST
 ************************************************************************/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define REP(i, a) REPP(i, 0, (a) - 1)
#define REPP(i, a, b) for (int i = int(a); i <= int(b); i++)
const int N = 505;
int mp[N][N], cnt[N], col[N], n, m;

bool dfs(int x, int c = 0) {
    bool bad = 1;
    REPP(i, 1, n) if (x != i && mp[x][i] == 0) {
        if (col[i] != 2) {
            if (col[i] != 1 - c) return 0;
        }
        else {
            col[i] = 1 - c;
            bad &= dfs(i, col[i]);
        }
    }
    return bad;
}

int main() {
#ifdef HOME
    string file(__FILE__);
    freopen((file.substr(0, file.find('.')) + ".in").c_str(), "r", stdin);
#endif
    cin >> n >> m;
    REP(i, m) {
        int x, y;
        scanf("%d%d", &x, &y);
        mp[x][y] = mp[y][x] = 1;
    }
    REPP(i, 1, n) {
        REPP(j, 1, n) {
            if (mp[i][j]) cnt[i]++;
        }
    }
    REPP(i, 1, n) col[i] = 2;
    int good = 1;
    REPP(i, 1, n) if (cnt[i] != n - 1 && col[i] == 2) {
        col[i] = 0;
        good &= dfs(i);
    }
    if (good) {
        REPP(i, 1, n) {
            REPP(j, i + 1, n) {
                if (col[i] == 2) {
                    if (!mp[i][j]) good = 0;
                }
                else if ((col[i] ^ col[j]) == 1) {
                    if (mp[i][j]) good = 0;
                }
            }
        }
    }
    !good ? puts("No") : puts("Yes");
    if (good) {
        REPP(i, 1, n) {
            if (col[i] == 2) {
                cout << 'b';
            }
            else if (col[i] == 0) {
                cout << 'a';
            }
            else {
                cout << 'c';
            }
        }
        cout << endl;
    }
    return 0;
}

/*
ID: SunitSwn
LANG: C++
*/

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

int main() {
    int n,m;
    cin>>n>>m;
    if(m==0){
        if(n>2){
            cout<<"No";
            return 0;
        }
        cout<<"Yes\n";
        for(int i=0 ;i<2*n ; i+=2){
            cout<<(char)(i+97);
        }
        return 0;
    }
    int a[n][n];
    vector<pair<int ,int > > p;
    for(int i=0 ;i<n; i++){
        for(int j = 0; j<n ; j++){
            a[i][j] = 0;
        }
    }

   int st;
    vector< vector<int> > v (n);
    map<pair<int ,int > ,int> mp;
    for(int i=0 ;i<m;i++){
        int x,y;
        cin>>x>>y;
        if(x>y) swap(x,y);
        a[x-1][y-1] = 1;
        p.push_back(make_pair(x-1,y-1));
        mp.insert(make_pair(make_pair(x-1,y-1),0));

    }
    for(int i=0 ;i<n; i++){
        for(int j = i+1; j<n ;j++){
            if(a[i][j] == 0){
                st =i;
                v[i].push_back(j);
                v[j].push_back(i);
            }
        }
    }
    for(int i=0 ;i<n;i++){
        // cout<<"\n "<<i<<" : ";
    for(int j=0 ;j<v[i].size(); j++){
        //  cout<< v[i][j]<<" ";
        }
    }
    queue<int> q;
    int mark[n] = {0};
    int ans[n] = {0};
    q.push(st);
    ans[st] = 'a';
    while(!q.empty()){
        int x = q.front();
        q.pop();
        mark[x] =1;
        for(int j =0 ;j<v[x].size(); j++){
            if(mark[v[x][j]] == 0){
                q.push(v[x][j]);
                mark[v[x][j]] = 1;
                ans[v[x][j]] = ans[x]==97?99:97;
            }
        }
    }
    for(int i=0 ; i<n ;i++){
        if(ans[i]==0) ans[i] = 98;
    }

    for(int i=0 ;i<m; i++){
       int f = p[i].first;
       int s = p[i].second;
       if(abs(ans[f] - ans[s])>=2){
           cout<<"No";
           return 0;
       }
    }

    for(int i=0 ; i<n ; i++){
        for(int j=i+1 ;j<n ;j++){
            if(abs(ans[i] - ans[j])<2){
                map <pair<int ,int> ,int> ::iterator it ;
                if(mp.find(make_pair(i,j)) == mp.end()){
                    cout<<"No";
                    return 0;
                }
            }
        }
    }
    cout<<"Yes\n";
    for(int i=0 ; i<n ;i++){
        cout<<(char)ans[i];
    }
	return 0;
}

#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define lop(i,s,e) for(int i=s;i<=e;i++)
#define prina(a,n) for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;
#define prin2da(a,n,m) lop(i,0,n-1){lop(j,0,m-1)cout<<a[i][j]<<" ";cout<<endl;}
using namespace std;
ll n,m;
string s,t;
void bfs(int st,vector <vector<int > > &vec)
{
 queue<int > Q;
 Q.push(st);
bool vis[n+1]={0};
vis[st]=1;

    while(Q.size()!=0)
    {
    int p=Q.front();
    Q.pop();
    cout<<p<<" ";
    lop(i,0,vec[p].size()-1)
      if(vis[vec[p][i]]==0)
      Q.push(vec[p][i]),vis[vec[p][i]]=1;
    }
}
int main()
{
IOS
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
ll n,m;
cin>>n>>m;
int a[n+1][n+1];
memset(a,0,sizeof(a));
lop(i,1,n)
a[i][i]=1;
lop(i,1,m)
{
    ll aa,b;
    cin>>aa>>b;
    a[aa][b]=1;
    a[b][aa]=1;
}
int col[n+1]={0};
int fg=1;
lop(i,1,n)
{
vector<ll> vec;
lop(j,1,n)
{
if(a[i][j]==0)
    vec.pb(j);
}
int sz=vec.size();
for(int j=0;j<sz;j++)
{
    for(int k=j+1;k<sz;k++)
    {
        if(a[vec[j]][vec[k]]==0)
            fg=0;
    }
}
if(col[i]==0&& sz>0)
{
    int jj=0;
    lop(j,0,sz-1)
    {
        jj=max(0,col[vec[j]]);
    }
    if(jj==1||jj==3)
    {
      lop(j,0,sz-1)
    {
        col[vec[j]]=jj;
    }
    if(jj==3)
    col[i]=1;
    else
        col[i]=1;
    }
    else
    {
        col[i]=1;
        lop(j,0,sz-1)
    {
        col[vec[j]]=3;
    }
    }
}
else if(sz>0)
{
    if(col[i]==1)
    {
        lop(j,0,sz-1)
    {
        col[vec[j]]=3;
    }
    }
    else if(col[i]==3)
    {
        lop(j,0,sz-1)
    {
        col[vec[j]]=1;
    }
    }

}

}
lop(i,1,n)
{
    lop(j,1,n)
    {
        if(a[i][j]==1)
        {
            if(col[i]!=0&&col[j]!=0&&abs(col[i]-col[j])==2)
                fg=0;
        }
    }
}
if(fg)
cout<<"YES\n";
else
cout<<"NO";
if(fg)
lop(i,1,n)
{
    if(col[i]==1)
        cout<<"a";
    else if(col[i]==2)
        cout<<"b";
    else if(col[i]==3)
        cout<<"c";
    else
        cout<<"b";

}
cout<<endl;

}

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <utility>
#include <deque>
#include <bitset>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;

int const MAX_N = 510 * 2;
int const MAX_CH = 500100 * 2;
char const CHAR_INF = 100;
long long const LL_INF = 1000000000000000009LL;

int sm[MAX_N][MAX_N],sm_len[MAX_N];
int used[MAX_N][MAX_N];
int aa_sm[MAX_N][MAX_N],aa_sm_len[MAX_N];
int nnew[MAX_N],och[MAX_N];
int rr[100],rr_len = 0;

inline int my_abs(int x) {
	if (x<0) return -x;
	return x;
}

int def_newc(int c, int st) {
	if (c == 2) {
		if (st == 0) return 1;
		return 3;
	}

	if (st == 0)
		return c;
	if (st == 1) {
		return 4-c;
	}
	if (st == 2) {
		if (rand()%2) return c;
		return 4-c;
	}
}

int def_2_diff(int c) {
	if (c == 1) return 3;
	if (c == 3) return 1;
	if (c == 2) return -1;
	return -1;
}

int dg[MAX_N];

int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);

	srand(17);
	int n,m;
	scanf("%d%d",&n,&m);
	for (int i=0; i<m; i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		a--; b--;
		sm[a][sm_len[a]++] = b;
		sm[b][sm_len[b]++] = a;
		dg[a]++;
		dg[b]++;
		used[a][b] = used[b][a] = 1;
	}

	for (int i=0; i<n; i++)
		for (int j=i+1; j<n; j++)
			if (!used[i][j]) {
				int a = i;
				int b = j;
				aa_sm[a][aa_sm_len[a]++] = b;
				aa_sm[b][aa_sm_len[b]++] = a;
			}

	for (int strat = 0; strat <= 6; strat++)
		for (int c_bg=1; c_bg<=3; c_bg++)
			for (int i=0; i<n; i++) {
				for (int j=0; j<n; j++) nnew[j] = 0;
				int p_read = 0, p_write = 1;
				nnew[i] = c_bg;
				och[p_read] = i;
				int Ok = 1;

				for (int j=0; j<n; j++)
					if (dg[j] == n-1)
						nnew[j] = 2;

				while (p_read < p_write && Ok) {
					int v = och[p_read++];
					for (int j=0; j<sm_len[v]; j++) {
						int new_v = sm[v][j];
						if (nnew[new_v] > 0) {
							if (my_abs(nnew[v]-nnew[new_v]) >= 2) {
								Ok = 0;
								break;
							}
						}
						else {
							nnew[new_v] = def_newc(nnew[v], strat);
							och[p_write++] = new_v;
						}
					}
					for (int j=0; j<aa_sm_len[v]; j++) {
						int new_v = aa_sm[v][j];
						if (nnew[new_v] > 0) {
							if (my_abs(nnew[v]-nnew[new_v]) != 2) {
								Ok = 0;
								break;
							}
						}
						else {
							nnew[new_v] = def_2_diff(nnew[v]);
							if (nnew[new_v] < 0)
								Ok = 0;

							och[p_write++] = new_v;
						}
					}
				}
				if (!Ok)
					continue;

				printf("Yes\n");
				for (int j=0; j<n; j++)
					printf("%c",(char) (nnew[j]-1 + 'a'));

				return 0;
			}

	printf("No");
	return 0;
}

#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

int graph[505][505],visited[505];
//vector<int> adj[505];
char ans[505];
/*void dfs(int i)
{
    visited[i]=1;
    for(int j=0;j<adj[i].size();j++)
    {
        if(!visited[adj[i][j]])
            dfs(adj[i][j]);
    }
}*/

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int u,v;
        cin>>u>>v;
        //adj[u].push_back(v);
        //adj[v].push_back(u);
        graph[u][v]=1;
        graph[v][u]=1;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(!graph[i][j]){
                for(int k=j+1;k<=n;k++)
                {
                    if(!graph[i][k]){
                        if(!graph[j][k])
                        {
                            //cout<<j<<" "<<k;
                            cout<<"No";
                            return 0;
                        }
                    }
                }
            }
        }
    }

    /*dfs(1);
    for(int i=1;i<=n;i++)
    {
        if(visited[i])
            cout<<"a";
        else
            cout<<"c";
    }*/
    for(int i=1;i<=n;i++)
        ans[i]='b';
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(!graph[i][j])
            {
                if(ans[i]=='a')
                {
                    ans[j]='c';
                }
                else if(ans[i]=='c')
                {
                    ans[j]='a';
                }
                else
                {
                    ans[i]='a';
                    ans[j]='c';
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(graph[i][j])
            {
                if(ans[i]=='a')
                {
                    if(ans[j]=='c')
                    {
                        cout<<"No";
                        return 0;
                    }
                }
                else if(ans[i]=='c')
                {
                    if(ans[j]=='a')
                    {
                        cout<<"No";
                        return 0;
                    }
                }
            }
            else
            {
                if(ans[i]=='b')
                {
                    cout<<"No";
                    return 0;
                }
                else if(ans[i]=='a')
                {
                    if(ans[j]=='a'||ans[j]=='b')
                    {
                        cout<<"No";
                        return 0;
                    }
                }
                else if(ans[i]=='c')
                {
                    if(ans[j]=='c'||ans[j]=='b')
                    {
                        cout<<"No";
                        return 0;
                    }
                }
            }
        }
    }
    cout<<"Yes\n";
    for(int i=1;i<=n;i++)
    {
        cout<<ans[i];
    }
    return 0;
}

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

#define FOR(i, a, b) for(int i=a; i<=b; i++)
#define DOW(i, a, b) for(int i=a; i>=b; i--)
#define S(a)  scanf("%d",&a)
#define LS(a) scanf("%lld",&a)
#define DS(a) scanf("%lf",&a)
#define PC(a) printf("Case %d: ",a)
#define P(a) printf("%d\n",a)
#define LP(a)  printf("%lld",a)
#define DP(a) printf("%.04lf",a)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi   first
#define se     second
#define fast std::ios::sync_with_stdio(false),cin.tie(0)
#define init freopen("input.txt","r",stdin)
#define outit freopen("output.txt","w",stdout)
#define INF 0xfffffff
#define gc getchar

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> ii;
typedef vector<ii>  vii;
typedef vector<vector<int>> vvi;
typedef vector<vector<ii>> vvii;

inline void read(int &x)
{

    x=0;
    register char c=gc();
    for(; c<'0' || c>'9'; c=gc());
    for(; c>='0' && c<='9'; c=gc())
        x=(x<<3)+(x<<1)+(c-'0');
}
inline void write(int x)
{

    register char buffor[35];
    register int i=0;
    do
    {
        buffor[i++]=(x%10)+'0';
        x/=10;
    }
    while(x);
    i--;
    while(i>=0) putchar(buffor[i--]);
    putchar('\n');
}
int adm[501][501];
string ans="Yes";
int n,m;
vi deg;
// vector<vector<int>> adl;

int main()
{

    //fast;
    //  int t;
    // S(t);
    //for(int tc=1; tc<=t; tc++)
    {

        S(n),S(m);
        int a,b;

        deg.assign(n,0);

        for(int i=0; i<m; i++)
        {
            S(a),S(b);
            a--;
            b--;
            adm[a][b]=adm[b][a]=1;
            deg[a]++,deg[b]++;

        }
        string s(n,'A');
        //s=k;
        for(int i=0; i<n; i++)
        {
            if(deg[i]==n-1)
            {
                s[i]='b';

            }

        }

        for(int i=0; i<n; i++)
        {
            if(s[i]=='A' )
            {
                s[i]='a';
                for(int j=0; j<n; j++)
                {
                    if(adm[i][j]==1 && s[j]=='A')
                        s[j]='a';
                    else if(adm[i][j]==0 && s[j]=='A') s[j]='c';

                }

            }

        }

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(i!=j)
                {
                    if(adm[i][j]==0 && abs(s[i]-s[j])<=1 || adm[i][j]==1 && abs(s[i]-s[j])>1)
                    {
                        ans="No";
                        break;

                    }
                }

            }

        }

        if(ans=="Yes")
        {
            printf("%s\n%s",ans.c_str(),s.c_str());

        }
        else printf("%s\n",ans.c_str());

    }

    return 0;

}

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair

int used[1111] = {0};
int color = 0;
int n,m;
int kol[1111] = {0};
vector <char> ans;
int g[1111][1111] = {0};

vector<vector <int> > v;

int dfs(int x) {
    used[x] = color;
    for (int i = 0; i < v[x].size(); i++) {
        if (used[v[x][i]] != 0 && used[v[x][i]] != color && used[v[x][i]] != 3) {
            cout << "No";
            exit(0);
        }
        if (used[v[x][i]] == 0) dfs(v[x][i]);
    }
}

bool foo(int x, int y) {
    if (x + y == 3) return false;
    return true;
}

bool check() {
    for (int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if (foo(used[i], used[j]) && g[i][j] == 0 && i!=j) return false;
        }
    }
    return true;
}

int main() {
    cin >> n >> m;
    v.resize(n);
    for (int i = 0; i < m; i++) {
            int q,w;
        cin >> q >> w; q--; w--;
        v[q].pb(w);
        v[w].pb(q);
        kol[q]++;
        kol[w]++;
        g[q][w] = 1;
        g[w][q] = 1;
    }
    ans.resize(n);
    for (int i = 0; i < n; i++) {
        if (kol[i] == n-1) {
            used[i] = 3;
        }
    }
    color = 0;
    for (int i = 0; i < n; i++) {
        if (used[i] == 0) {
            if (color == 2) {
                cout << "No";
                exit(0);
            }
            color++;
            dfs(i);
        }
    }
    if (check()) {
        cout << "Yes\n";
        for (int i = 0;i < n; i++) {
            if (used[i] == 3) cout << "b";
            if (used[i] == 2) cout << "c";
            if (used[i] == 1) cout << "a";
        }
    } else {
        cout << "No";
    }
}

# include <cstdio>
# include <cstring>
# include <cassert>
# include <algorithm>
# include <iostream>
# include <cmath>
# include <map>
using namespace std;

# define REP(i, n) for (int i = 1; i <= n; ++ i)
# define REP_0(i, n) for (int i = 0; i < n; ++ i)
# define REP_0N(i, n) for (int i = 0; i <= n; ++ i)
# define REP_G(i, x) for (int i = pos[x]; i; i = g[i].frt)
# define FOR(i, a, b) for (int i = a; i <= b; ++ i)
# define DWN(i, a, b) for (int i = b; i >= a; -- i)
# define RST(a) memset (a, 0, sizeof (a))
# define CLR(a, x) memset (a, x, sizeof (a))

# define FAIL return puts ("No"), 0

typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

# define w0 first
# define w1 second
# define pub push_back
# define NR 1000
# define seed0 1214ll
# define p0 1000000007ll
# define seed1 337ll
# define p1 1000000009ll
map <pll, int> tid;
bool tg[NR][NR];
int n, m, d[10], w[NR], psz;
vector <int> tt[10];

bool check () {
	//printf ("a: ");
	for (int i : tt[1]) w[i] = d[1];//, printf ("%d ", i); puts ("");

	//printf ("b: ");
	for (int i : tt[2]) w[i] = d[2];//, printf ("%d ", i); puts ("");
	//printf ("c: ");
	for (int i : tt[3]) w[i] = d[3];//, printf ("%d ", i); puts ("");

	//REP (i, n) printf ("%d ", w[i]); puts ("");

	REP (i, n) REP (j, n) if (i != j && tg[i][j] != (abs (w[i] - w[j]) <= 1)) return false;
	printf ("Yes\n");
	REP (i, n) putchar ('a' + w[i]);
	putchar ('\n');
	return true;
}

bool dfs (int i) {
	if (i > psz) return check ();
	d[i] = 0; if (dfs (i + 1)) return true;
	d[i] = 1; if (dfs (i + 1)) return true;
	d[i] = 2; if (dfs (i + 1)) return true;
	return false;
}

int main () {
	//freopen ("A.in", "r", stdin);
	scanf ("%d%d", &n, &m); int t1, t2;
	REP (i, m) {
		scanf ("%d%d", &t1, &t2);

		tg[t1][t2] = tg[t2][t1] = 1;
	}

	REP (i, n) {
		ll h0 = 0, h1 = 0;
		REP (j, n) {
			//assert (tg[i][j] || i == j);
			h0 = (h0 * seed0 + ((tg[i][j] || i == j) ? 37 : 2)) % p0,
			h1 = (h1 * seed1 + ((tg[i][j] || i == j) ? 22 : 3)) % p1;
		}
		//cout << h0 << " " << h1 << endl;
		//printf ("%I64d %I64d\n", h0, h1);

		if (tid.find (pll (h0, h1)) == tid.end ()) {
			tt[tid[pll (h0, h1)] = ++ psz].pub (i);
		}
		else tt[tid[pll (h0, h1)]].pub (i);
		if (psz > 3) FAIL;
	}
	//printf ("%d\n", psz);

	if (!dfs (1)) FAIL;

	return 0;
}

#include <iostream>
#include <algorithm>
#include <set>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
vector <int> g[502];
int n,m,i,j,a,b;
int dg[502];
int answ[502];
bool mark[502];
bool ka[502][502];
int Q;
void dfs(int x)
{
	int i,v;
	answ[x] = Q;
	mark[x] = true;
	for(i=0;i<g[x].size();i++)
	{
		v = g[x][i];
		if(mark[v]) continue;
		dfs(v);
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d", &a, &b);
		g[a].push_back(b);
		g[b].push_back(a);
		dg[a]++;
		dg[b]++;
		ka[a][b] = ka[b][a] = true;
	}
	for(i=1;i<=n;i++)
	{
		if(dg[i] == n-1)
		{
			answ[i] = 3;
			mark[i] = true;
		}
	}
	Q = 0;
	for(i=1;i<=n;i++)
	{
		if(mark[i]) continue;
		Q++;
		dfs(i);
	}
	if(Q > 2)
	{
		cout<<"No"<<endl;
		return 0;
	}
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			if((answ[i] == 1 && answ[j] == 2) || (answ[i] == 2 && answ[j] == 1))
			{
				if(ka[i][j])
				{
					cout<<"No"<<endl;
					return 0;
				}
			}
			else if(!ka[i][j])
			{
				cout<<"No"<<endl;
				return 0;
			}
		}
	cout<<"Yes"<<endl;
	for(i=1;i<=n;i++)
	{
		if(answ[i] == 1) printf("a");
		else if(answ[i] == 2) printf("c");
		else printf("b");
	}
	cout<<endl;
	//cin>>i;
	return 0;
}
/*
3 2
1 2
420 421
420420 420421

1/2, 1/2, 1/2;
*/

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

const int MAXN = 500;

int g[MAXN][MAXN];

vector<int> nope;

set<int> g1, g2, check;

int main(){
	int n, m;
	cin >> n >> m;
	int x, y;
	for (int i = 0; i < m; i++){
		cin >> x >> y;
		--x;
		--y;
		g[x][y] = 1;
		g[y][x] = 1;
	}
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			if (g[i][j] == 0 && i != j){
				if (!check.count(i)){
					nope.push_back(i);
					check.insert(i);
				}
			}
		}
	}
	/*for (int j = 0; j < nope.size(); j++)
		cout << nope[j] << " ";
	cout << endl;*/
	for (int i = 0; i < nope.size(); i++){
		/*for (set<int> :: iterator it = g2.begin(); it != g2.end(); it++){
			cout << (*it) << " ";
		}
		cout << endl;
		for (set<int> :: iterator it = g2.begin(); it != g2.end(); it++){
			cout << (*it) << " ";
		}
		cout << endl;*/
		bool flag = true;
		for (set<int> :: iterator it = g1.begin(); it != g1.end(); it++){
			if (g[nope[i]][(*it)] == 0){
				flag = false;
				break;
			}
		}
		if (flag){
			g1.insert(nope[i]);
		}
		else{
			bool flag = true;
			for (set<int> :: iterator it = g2.begin(); it != g2.end(); it++){
				if (g[nope[i]][(*it)] == 0){
					flag = false;
					break;
				}
			}
			if (flag)
				g2.insert(nope[i]);
			else{
				cout << "No";
				return 0;
			}
		}
		for (set<int> :: iterator it = g1.begin(); it != g1.end(); it++)
			for (set<int> :: iterator it1 = g2.begin(); it1 != g2.end(); it1++)
				if (g[(*it)][(*it1)] == 1){
					cout << "No";
					return 0;
				}
	}

	/*for (set<int> :: iterator it = g2.begin(); it != g2.end(); it++){
		cout << (*it) << endl;
	}*/
	for (set<int> :: iterator it = g1.begin(); it != g1.end(); it++){
		if (g2.count(*it)){
			cout << "No";
			return 0;
		}
	}
	cout << "Yes" << endl;
	char ans[501];
	for (set<int> :: iterator it = g1.begin(); it != g1.end(); it++)
		ans[(*it)] = 'a';
	for (set<int> :: iterator it = g2.begin(); it != g2.end(); it++)
		ans[(*it)] = 'c';
	for (int i = 0; i < n; i++)
		if (ans[i] != 'a' && ans[i] != 'c')
			ans[i] = 'b';
	for (int i = 0; i < n; i++)
		cout << ans[i];
}

/*
5 7
1 2
2 3
2 4
2 5
3 4
3 5
4 5
*/

#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;

#define rg register
#define il inline
#define MX (500 + 22)

int E[MX][MX] ,in[MX];
int fa[MX << 1];
char a[MX];
int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);}
void link(int u ,int v){fa[find(u)] = find(v);}

int main(){
	int n ,m; cin >> n >> m;
	for(int i = 1 ,u ,v ; i <= m ; ++i){
		cin >> u >> v;
		E[u][v] = E[v][u] = true;
	}
	for(int i = 1 ; i <= 2 * n ; ++i)
		fa[i] = i;
	int cnt = 0 ,ran;
	for(int i = 1 ; i <= n ; ++i){
		for(int j = i + 1 ; j <= n ; ++j){
			if(!E[i][j]){
				ran = i ,++cnt ,in[i] = true ,in[j] = true;
				if(find(i) == find(j) || find(i + n) == find(j + n))
					return 0 * puts("No");
				else link(i ,j + n) ,link(i + n , j);
			}
		}
	}
	for(int i = 1 ; i <= n ; ++i){
		if(!in[i]) a[i] = 'b';
		else if(find(i) == find(ran)) a[i] = 'a';
		else a[i] = 'c';
	}
	for(int i = 1 ; i <= n ; ++i)
		for(int j = i + 1 ; j <= n ; ++j)
			if(!E[i][j]){
				if(a[i] == a[j] || a[i] == 'b' || a[j] == 'b')
					return 0 * puts("No");
			}
			else{
				if(a[i] != a[j] && a[i] != 'b' && a[j] != 'b')
					return 0 * puts("No");
			}
	puts("Yes");
	puts(a + 1);
	return 0;
}

#include <bits/stdc++.h>

using namespace std;

int col[501];
int tcol[501];
int edge[501][501];

void docol(int v, int c) {
    col[v] = c;
    for(int i = 1; i <= v; ++i) {
        if(edge[v][i] && col[i] == -1) {
            docol(i, c);
        }
    }
}

int main(void) {
    ios_base::sync_with_stdio(false);
    int n;
    cin>>n;
    int k;
    cin>>k;
    memset(tcol, -1, sizeof(tcol));
    memset(col, -1, sizeof(col));
    memset(edge, 0, sizeof(edge));

    for(int i = 1; i <= k; ++i) {
        int a, b;
        cin>>a>>b;
        edge[a][b] = 1;
        edge[b][a] = 1;
    }

    int b = 0;
    for(int i = 1; i <= n; ++i) {
        bool flag = true;
        for(int j = 1; j <= n; ++j) {
            if(i == j)  continue;
            if(edge[i][j] == 0) {
                flag = false;
                break;
            }
        }
        //cout<<"i "<<i<<" "<<flag<<endl;
        if(flag) {
            tcol[i] = 1;
            b++;
        }
    }

    if(b == n) {
        cout<<"Yes\n";
        for(int i = 1; i <= n; ++i)
            cout<<"b";
        return 0;
    }

    for(int i = 1; i <= n; ++i) {
        if(tcol[i] != -1)   continue;
        memset(col, -1, sizeof(col));
        for(int j = 1; j <= n; ++j)
            col[j] = tcol[j];
        docol(i, 0);

        for(int j = 1; j <= n; ++j) {
            if(col[j] == -1)
                col[j] = 2;
        }

//        for(int j = 1; j <= n; ++j) {
//            cout<<j<<" ";
//            cout<<"tcol "<<tcol[j]<<" col "<<col[j]<<endl;
//        }

        bool flag = false;
        for(int ii = 1; ii <= n && !flag; ++ii) {
            for(int j = 1; j <= n && !flag; ++j) {
                if(ii == j)  continue;
                if(edge[ii][j] == 0) {
                    if((col[ii] == 0 && col[j] == 2) || (col[ii] == 2 && col[j] == 0))  continue;
                    else {
                        flag = true;
                        break;
                    }
                }
                if(col[ii] == 1 || col[j] == 1) continue;
                if(col[ii] == 0 && (col[j] == 0 || col[j] == 1)) continue;
                if(col[ii] == 2 && (col[j] == 2 || col[j] == 1)) continue;
                flag = true;
                break;
            }
        }
        if(flag)   continue;
        cout<<"Yes\n";
        for(int ii = 1; ii <= n; ++ii)
            cout<<(col[ii] == 0 ? 'a' : col[ii] == 1 ? 'b' : 'c');
        return 0;

    }

   cout<<"No";

    return 0;
}

#include<bits/stdc++.h>
using namespace std;
//#define flg cout<<"flag\n";
#define flg(i) cout<<"flag\n"<<i<<endl;
#define f(i,j,k) for(auto i=j;i<int(k);i++)
#define wch(x) cout<<(#x)<<" "<<x<<endl
#define fio ios::sync_with_stdio(0);cin.tie(NULL)
#define pb(a) push_back(a)
#define m(a) memset(a,0,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi pair<int,int>
#define ti tuple<int,int,int>
#define mt(a,b,c) make_tuple(a,b,c)
//#define pp(a) cout<<a.first<<" "<<a.second<<"\n"
const int mn=INT_MIN;
const int mx=INT_MAX;
vector<vector<int>> edge(502);
int clr[502];
int cnt1=0,cnt2=0,cnt0=0;
int main()
{fio;m(clr);
int n,m,u,v;
cin>>n>>m;
f(i,0,m)
{cin>>u>>v;
    edge[u].pb(v);
    edge[v].pb(u);
    };
f(i,1,n+1) {
    if(edge[i].size()==n-1) {clr[i]=2;cnt2++;};
    };
    int cnsdr=0;
f(i,1,n+1) {
    if(!clr[i]) {cnsdr=i;clr[i]=1;cnt1++;break;};
    };
    bool flag=0;
for(auto a:edge[cnsdr]) {
    if(!clr[a]) {clr[a]=1;cnt1++;};};   //0 c
    cnt0=n-cnt1-cnt2;

    int p=1;
for(auto a=edge.begin()+1;a<edge.begin()+n+1;a++ )
{int t1=0,t2=0,t0=0;
if(p>n) break;
    for(auto b : *a)
    { if(clr[b]==1) t1++;
    if(clr[b]==2) t2++;
        if(clr[b]==0) {t0++;}
        }

    if(clr[p]==1  && ( t1!=cnt1-1 || t2!=cnt2  || t0!=0  ) ) {flag=1;};
    if(clr[p]==2  && ( t1!=cnt1 || t2!=cnt2-1  || t0!=cnt0  ) ) {flag=1;};
    if(clr[p]==0  && ( t1!=0 || t2!=cnt2  || t0!=cnt0-1  ) ) {flag=1;};
    p++;
    }
    if(flag) {cout<<"No\n";}
    else {cout<<"Yes\n";
    f(i,1,n+1) {
        if(clr[i]==0) cout<<'c';
        if(clr[i]==1) cout<<'a';
        if(clr[i]==2) cout<<'b';
        }

    }
    }

#include<bits/stdc++.h>
using namespace std;
int mp[550][550];
int vis[550];
int ct[550];
int main()
{
    int n,m;
    cin >> n >> m;
    for(int i = 0; i < m; i ++){
        int x,y;
        cin >> x >> y;
        mp[x][y] = mp[y][x] =1;
        ct[x]++;
        ct[y]++;
    }
    for(int i= 1; i <= n; i ++)
        if(ct[i] == n-1) vis[i] = 2;
    int pos=0;
    for(int i = 1; i <= n; i ++)
        if(vis[i] != 2){
            pos = i;
            break;
        }
    if(pos == 0){
        printf("Yes\n");
        for(int i=  1; i <= n; i ++)
            cout <<"b";
        puts("");
    }
    else{
        vis[pos] = 1;
        for(int i = 1; i <= n;i ++){
            if(pos == i) continue;
            else if(!mp[pos][i]) vis[i]=3;
            else  if(vis[i] == 0) vis[i]=1;
        }

        for(int i = 1; i <= n; i ++)
        for(int j =1; j <= n; j ++){
            if(i == j) continue;
            if(mp[i][j] && abs(vis[i]-vis[j])> 1){
                printf("No\n");
                return 0;
            }
            if(mp[i][j]==0&&abs(vis[i]-vis[j])<=1){
                printf("No\n");
                return 0;
            }
        }
        printf("Yes\n");
        for(int i = 1; i <= n; i++)
            if(vis[i] == 1)cout <<"a";
            else if(vis[i] == 2) cout <<"b";
            else    cout <<"c";
        puts("");
    }
}

#include <bits/stdc++.h>

#define forn(i,n) for (int i = 0; i < n; i++)
#define ford(i,n) for (int i = n - 1; i >= 0; i--)
#define forl(i,l,r) for (int i = l; i <= r; i++)
#define IOS ios_base::sync_with_stdio(false)
#define pb(i) push_back(i)
#define sc(i) scanf("%d", &i)
#define f first
#define s second

using namespace std;

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef string str;
typedef vector < ll > v;
typedef vector < vector < ll > > vv;

vector < char > ans;
vector < vector < ll > > a;
vector < ll > sz, vis, vis3;
ll bt = 0, ptr = 0, qwew = 1;

void dfs(char t, int i, int e)
{
    if (a[i].size() - bt != ptr - 1)
        qwew = 0;

    if (qwew == 0)
        return;

    vis[i] = 1;
    ans[i] = t;

    forn(k, a[i].size())
    {
        if (vis[a[i][k]] != 1)
        {
            dfs(t, a[i][k], e);
            break;
        }
    }
}

void check(int i, int e)
{
    vis3[i] = 1;

    forn(k, a[i].size())
    {
        if (vis3[a[i][k]] != 1)
        {
            check(a[i][k], e + 1);
            break;
        }
    }

    ptr = max(ptr, (ll)e);
}

int main()
{
    IOS;

    ll n, m, x, y, k = 0, e = 0;

    cin >> n >> m;

    sz.resize(n, 0);
    a.resize(n);
    vis.resize(n, 0);
    vis3.resize(n, 0);
    ans.resize(n);
    v vis2(n, 0);

    forn(i, m)
    {
        cin >> x >> y;

        x--;
        y--;

        vis2[x] = 1;
        vis2[y] = 1;

        a[x].pb(y);
        a[y].pb(x);
        sz[x]++;
        sz[y]++;

        if (sz[x] == n - 1)
            ans[x] = 'b', vis[x] = vis3[x] = 1, bt++;

        if (sz[y] == n - 1)
            ans[y] = 'b', vis[y] = vis3[y] = 1, bt++;
    }

    k = 0;

    forn(i,n)
    {
        if (k == 0 && vis[i] == 0)
        {
            ptr = 0;
            check(i, 1);
            dfs('a', i, e), k++;
            continue;
        }

        if (k == 1 && vis[i] == 0)
        {
            ptr = 0;
            check(i, 1);
            dfs('c', i, e), k++;
            continue;
        }

        if (k == 2 && vis[i] == 0)
            {
                cout << "NO\n";
                return 0;
            }
    }

    if (qwew == 0)
    {
        cout << "NO\n";
        return 0;
    }

    cout << "YES\n";

    forn(i,n)
    cout << ans[i];

    cout << endl;
}

#include<bits/stdc++.h>
#define In_the_name_of_allah_the_merciful ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define Alhamdulillah return 0;
#define pb push_back
#define ins(x) insert(x)
#define fi first
#define se second
#define ub upper_bound
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define sz(v) ((ll)((v).size()))
#define reset(v,val) memset(v,val,sizeof(v))
#define erep(i, x, n) for ( i = x; i<=(ll)(n); i++)
#define rep(i, x, n) for( i = x; i<(ll)(n); i++)
using namespace std;
typedef   long long  int   ll;
long long int mod=1e9+7;
ll dx[]={0,0,1,-1};
ll dy[]={1,-1,0,0};
ll m=0,n,res=0,k,ans=0;
string s2,ch="",s,t,s1="";
vector< pair<string,ll> >vm;
vector< pair< pair<ll,ll>,ll > > vvv;
vector<pair<ll,ll> >vv,vv2;
vector< ll > v[20005],v2,v1,adj[2005];
set<ll >st,st1;
ll a[505][505],vis[505],color[200005];
char b[200005];

bool dfs(ll x,ll p){
    vis[x]=1;
    for(ll i=0;i<adj[x].size();i++){
        ll y=adj[x][i];
        if(!vis[y]){
            color[y]=3-color[x];
            bool flag=dfs(y,x);
            if(flag)return flag;
        }
        else if(vis[y]&&y!=p&&color[x]==color[y])return true;
    }
    return false;

}

int main(){
                                     In_the_name_of_allah_the_merciful

    ll i=0,x=0,z=0,y=0,j=0,q,mx=0,idx=0,ok=0,l=0,r=0,negatif=0,positif=0,l1,r1,d,p,t;
    set< pair<ll,ll>  > ::iterator it,it1;
    //freopen("a.txt","r",stdin);
    cin>>n>>m;
    for(i=1;i<=m;i++){
        cin>>x>>y;
        v[x].pb(y);
        v[y].pb(x);
        a[x][y]=a[y][x]=1;
    }
    for(i=1;i<=n;i++){
        for(j=i+1;j<=n;j++){
            if(!a[i][j]){
                adj[i].pb(j);
                adj[j].pb(i);
            }
        }
    }
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++){
        b[i]='#';
        for(j=i+1;j<=n;j++){
            if(!a[i][j]){
                vis[i]=1;
                vis[j]=1;
            }
        }
    }
    for(i=1;i<=n;i++)if(!vis[i])b[i]='b';
    for(i=1;i<=n;i++){
        if(vis[i]){
            b[i]='a';
            for(j=0;j<v[i].size();j++){
               if(b[v[i][j]]=='#') b[v[i][j]]='a';
            }
            break;
        }
    }
    for(i=1;i<=n;i++){
        if(b[i]=='#')b[i]='c';
    }
    for(i=1;i<=n;i++){
        for(j=(i+1);j<=n;j++){
            if(a[i][j]==1&&((b[i]=='a'&&b[j]=='c')||(b[i]=='c'&&b[j]=='a')))return cout<<"No",0;
            else if(!a[i][j]&&!((b[i]=='a'&&b[j]=='c')||(b[i]=='c'&&b[j]=='a')))return cout<<"No",0;
        }
    }
    cout<<"Yes\n";
    for(i=1;i<=n;i++)cout<<b[i];

                                                Alhamdulillah
 }

#pragma warning (disable : 4996)
#pragma comment(linker, "/STACK:36777216")

#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <iomanip>
#include <ctime>
#include <algorithm>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
#define sqr(x) ((x) * (x))
#define mp make_pair

const ll INF = 1e17 + 7;
const ll MOD = 1e9 + 7;
const ld PI = acos(-1.0);
const int NUM = 507;

int g[NUM][NUM];
int cnt[NUM];
vector<int> as, bs, cs;

bool check(int v, char col){
	if (col == 'a'){
		for (int i = 0; i < as.size(); ++i)
		if (!g[v][as[i]])
			return false;
		for (int i = 0; i < cs.size(); ++i)
		if (g[v][cs[i]])
			return false;
	}
	else if (col == 'c'){
		for (int i = 0; i < cs.size(); ++i)
		if (!g[v][cs[i]])
			return false;
		for (int i = 0; i < as.size(); ++i)
		if (g[v][as[i]])
			return false;
	}
	return true;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout << fixed << setprecision(14);
#ifdef DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#else
	//freopen(CONTEST ".in", "r", stdin);
	//freopen(CONTEST ".out", "w", stdout);
#endif

	int n, m;
	cin >> n >> m;
	bool flag = (m == 95);
	for (int i = 0; i < m; ++i){
		int a, b;
		cin >> a >> b;
		--a; --b;
		g[a][b] = g[b][a] = 1;
		++cnt[a]; ++cnt[b];
	}
	for (int i = 0; i < n; ++i){
		g[i][i] = 1;
		++cnt[i];
	}

	string ans = "";
	for (int v = 0; v < n; ++v){
		ans += 'a';
		if (find(as.begin(), as.end(), v) != as.end() ||
			find(bs.begin(), bs.end(), v) != bs.end() ||
			find(cs.begin(), cs.end(), v) != cs.end()
			) continue;

		if (cnt[v] == n){
			bs.push_back(v);
		}
		else{
			int v1 = -1;
			for (int i = 0; i < n; ++i)
			if (!g[v][i])
				v1 = i;
			if (check(v1, 'a') && check(v, 'c')){
				if (find(as.begin(), as.end(), v1) == as.end())
					as.push_back(v1);
				cs.push_back(v);
			}
			else if (check(v1, 'c') && check(v, 'a')){
				if (find(cs.begin(), cs.end(), v1) == cs.end())
					cs.push_back(v1);
				as.push_back(v);
			}
			else{
				cout << "No";
				return 0;
			}
		}
	}
	for (int i = 0; i < bs.size(); ++i)
		ans[bs[i]] = 'b';
	for (int i = 0; i < cs.size(); ++i)
		ans[cs[i]] = 'c';

	cout << "Yes" << endl;
	cout << ans;

	return 0;
};

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

#define fi                      first
#define se                      second
#define pb                      push_back
#define endl                    '\n'
#define all(x)                  x.begin(),x.end()
#define pii                     pair<int,int>
#define pll                     pair< long long int, long long int>
#define fast                    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define SZ(x)                   ((int)x.size())

#define FOR(i,a,b)              for(int i = a; i < b; ++i)
#define REV(i,a,b)              for(int i = a; i >= b; --i)
#define FORE(i,a,b)             for(int i = a; i <= b; ++i)

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

void solve();

int32_t main()
{
        fast;
        int t = 1;
        // cin >> t;
        for(int i = 1; i <= t; ++i)
                solve();
        cerr << "Time taken: " << ((clock() * 1000) / CLOCKS_PER_SEC) << "ms\n";
}

const int N = 500+5;
int arr[N][N];
int n,m;
std::vector<int> vis(N,0);
string s;
void dfs(int node) {
	vis[node] = 1;
	if(s[node] == '*')
		s[node] = 'a';
	FOR(i,1,n+1) {
		if(arr[node][i] and !vis[i]) {
			dfs(i);
		}
	}
}

void solve() {
        cin >> n >> m;
        memset(arr,0,sizeof(arr));
        std::vector<int> deg(n+1,0);
        FOR(i,0,m) {
        	int u,v;
        	cin >> u >> v;
        	arr[u][v] = 1;
        	arr[v][u] = 1;
        	deg[u]++;
        	deg[v]++;
        }
        s.assign(n+1,'*');
        FOR(i,1,n+1) {
        	if(deg[i] == n-1) {
        		s[i] = 'b';
        		vis[i] = 1;
        	}
        }
        FOR(i,1,n+1) {
        	if(s[i] == '*') {
        		dfs(i);
        		break;
        	}
        }
        FOR(i,1,n+1) {
        	if(s[i] == '*')
        		s[i] = 'c';
        }
        FOR(i,1,n+1) {
        	FOR(j,i+1,n+1) {
        		if(arr[i][j] == 1 and ((s[i] == 'a' and s[j] == 'c') or (s[i] == 'c' and s[j] == 'a'))) {
        			cout << "No" << endl;
        			return;
        		}
        		if(arr[i][j] == 0 and ((s[i] == 'a' and s[j] == 'c') or (s[i] == 'c' and s[j] == 'a')) == false) {
        			cout << "No" << endl;
        			return;
        		}
        	}
        }
        cout << "Yes" << endl;
        FOR(i,1,n+1) cout << s[i];
        cout << endl;
}

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

int n, m;
const int maxn = 501;
int deg[maxn];
int vis[maxn];
int g[maxn][maxn];
int cc = 1;

void dfs(int v) {
  if (vis[v]) return ;
  vis[v] = cc;
  for (int i = 0; i < n; ++i)
    if (g[v][i]) dfs(i);
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int a, b; cin >> a >> b;
    --a; --b;
    deg[a]++;
    deg[b]++;
    g[a][b] = g[b][a] = 1;
  }
  for (int i = 0; i < n; ++i) {
    if (deg[i] == n - 1) {
      for (int j = 0; j < n; ++j)
        g[i][j] = g[j][i] = 0;
    }
  }
  for (int i = 0; i < n; ++i) {
    if (deg[i] < n - 1 && !vis[i]) {
      dfs(i);
      ++cc;
    }
  }
  if (cc > 3) {
    cout << "No";
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j)
      if (!g[i][j] && vis[i] && vis[j] && vis[i] == vis[j]) {
        cout << "No";
        return 0;
      }
  }
  cout << "Yes" << "\n";
  for (int i = 0; i < n; ++i) {
    cout << (char)(vis[i] ? (vis[i] == 1 ? 'a' : 'c') : 'b');
  }

  return 0;
}

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <map>
#include <set>

using namespace std;

const int MAXN = 505;

int n,m;
int fa[MAXN];
int val[MAXN];

char ans[MAXN];

bool G[MAXN][MAXN];
bool exist[MAXN];
bool vis[MAXN];

queue<int> Q;
vector<int> nodes,full;

int getroot(int u)
{
	return u == fa[u] ? u : fa[u] = getroot(fa[u]);
}

void solve(char &st)
{
	full.clear();
	full.push_back(nodes[0]);
	vis[nodes[0]] = 1;
	for (int i = 1;i < nodes.size();i++)
	{
		int u = nodes[i];
		bool ok = 1;
		for (int j = 0;j < full.size();j++)
			if (!G[u][full[j]])
			{
				ok = 0;
				break;
			}
		if (ok)
		{
			full.push_back(u);
			vis[u] = 1;
		}
	}
	for (int i = 0;i < nodes.size();i++)
		fa[nodes[i]] = nodes[i];
	for (int i = 0;i < nodes.size();i++)
	{
		int u = nodes[i];
		if (!vis[u])
			for (int j = 0;j < nodes.size();j++)
			{
				int v = nodes[j];
				if (!vis[v] && G[u][v])
					fa[getroot(u)] = getroot(v);
			}
	}
	int flag = 0;
	for (int i = 0;i < nodes.size();i++)
	{
		int u = nodes[i];
		if (vis[u])
		{
			for (int j = 0;j < nodes.size();j++)
			{
				int v = nodes[j];
				if (!vis[v] && G[u][v])
				{
					if (!flag)
						flag = getroot(v);
					if (flag == getroot(v))
						val[u] = 26;
					break;
				}
			}
			if (!val[u])
				val[u] = 25;
			Q.push(u);
		}
	}
	while (!Q.empty())
	{
		int u = Q.front();
		Q.pop();
		for (int i = 0;i < nodes.size();i++)
		{
			int v = nodes[i];
			if (!vis[v] && G[u][v])
			{
				val[v] = val[u] + (getroot(v) == flag ? 1 : -1);
				vis[v] = 1;
				Q.push(v);
			}
		}
	}
	for (int i = 0;i < nodes.size();i++)
		for (int j = 0;j < nodes.size();j++)
			if (i != j)
			{
				int u = nodes[i],v = nodes[j];
				if (!G[u][v] && abs(val[u] - val[v]) <= 1)
				{
					puts("No");
					exit(0);
				}
			}
	int MN = 1e9,MX = 0;
	for (int i = 0;i < nodes.size();i++)
	{
		int u = nodes[i];
		MN = min(MN,val[u]);
		MX = max(MX,val[u]);
	}
	for (int i = 0;i < nodes.size();i++)
	{
		int u = nodes[i];
		char t = st + val[u] - MN;
		if (t > 'c')
		{
			puts("No");
			exit(0);
		}
		ans[u] = t;
	}
	st = st + MX - MN + 2;
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i = 1;i <= n;i++)
		fa[i] = i;
	for (int u,v,i = 1;i <= m;i++)
	{
		scanf("%d%d",&u,&v);
		G[u][v] = G[v][u] = 1;
		fa[getroot(u)] = getroot(v);
	}
	char st = 'a';
	for (int i = 1;i <= n;i++)
		if (!vis[i])
		{
			nodes.clear();
			for (int j = 1;j <= n;j++)
				if (getroot(j) == getroot(i))
					nodes.push_back(j);
			solve(st);
		}
	puts("Yes");
	for (int i = 1;i <= n;i++)
		putchar(ans[i]);
	putchar('\n');
	return 0;
}

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

#define FOR(i, a, b) for(int i=a; i<=b; i++)
#define DOW(i, a, b) for(int i=a; i>=b; i--)
#define S(a)  scanf("%d",&a)
#define LS(a) scanf("%lld",&a)
#define DS(a) scanf("%lf",&a)
#define PC(a) printf("Case %d: ",a)
#define P(a) printf("%d\n",a)
#define LP(a)  printf("%lld",a)
#define DP(a) printf("%.04lf",a)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi   first
#define se     second
#define fast std::ios::sync_with_stdio(false),cin.tie(0)
#define init freopen("input.txt","r",stdin)
#define outit freopen("output.txt","w",stdout)
#define INF 0xfffffff
#define gc getchar

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> ii;
typedef vector<ii>  vii;
typedef vector<vector<int>> vvi;
typedef vector<vector<ii>> vvii;

inline void read(int &x)
{

    x=0;
    register char c=gc();
    for(; c<'0' || c>'9'; c=gc());
    for(; c>='0' && c<='9'; c=gc())
        x=(x<<3)+(x<<1)+(c-'0');
}
inline void write(int x)
{

    register char buffor[35];
    register int i=0;
    do
    {
        buffor[i++]=(x%10)+'0';
        x/=10;
    }
    while(x);
    i--;
    while(i>=0) putchar(buffor[i--]);
    putchar('\n');
}
int adm[501][501];
string ans="Yes";
int n,m;
int deg[501];
// vector<vector<int>> adl;

int main()
{

    //fast;
    //  int t;
    // S(t);
    //for(int tc=1; tc<=t; tc++)
    {

        read(n),read(m);
        int a,b;

       // deg.assign(n,0);

        for(int i=0; i<m; i++)
        {
            read(a),read(b);
            --a;
            --b;
            adm[a][b]=adm[b][a]=1;
            ++deg[a],++deg[b];

        }
        string s(n,'A');
        //s=k;
        for(int i=0; i<n; i++)
        {
            if(deg[i]==n-1)
            {
                s[i]='b';

            }

        }

        for(int i=0; i<n; i++)
        {
            if(s[i]=='A' )
            {
                s[i]='a';
                for(int j=0; j<n; j++)
                {
                    if(adm[i][j]==1 && s[j]=='A')
                        s[j]='a';
                    else if(adm[i][j]==0 && s[j]=='A') s[j]='c';

                }

            }

        }

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(i!=j)
                {
                    if(adm[i][j]==0 && abs(s[i]-s[j])<=1 || adm[i][j]==1 && abs(s[i]-s[j])>1)
                    {
                       // ans="No";
                        printf("No\n");
                        return 0;

                    }
                }

            }

        }

            printf("Yes\n%s",s.c_str());

    }

    return 0;

}

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 505;

int n, m;
int g[N][N];
int col[N];

int cnt;

bool dfs(int u, int c) {
    if (col[u] != -1) return col[u] == c;
    col[u] = c;
    cnt++;
    for (int i = 1; i <= n; i++) {
        if (i == u) continue;
        if (g[u][i]) {
            if (!dfs(i, !c)) return false;
        }
    }
    return true;
}

bool judge() {
    int tot = 0;
    memset(col, -1, sizeof(col));
    for (int i = 1; i <= n; i++) {
        if (col[i] == -1) {
            cnt = 0;
            if (dfs(i, 0) == 0) return false;
            if (cnt > 1) tot++;
            else if (cnt == 1) {
                col[i] = 2;
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        if (col[i] == 2) continue;
        for (int j = i + 1; j <= n; j++) {
            if (col[j] == 2) continue;
            if (col[i] != col[j] && g[i][j] == 0) return false;
        }
    }
    return tot <= 1;
}

int main() {
    scanf("%d%d", &n, &m);
    int u, v;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            g[i][j] = 1;
    }
    while (m--) {
        scanf("%d%d", &u, &v);
        g[u][v] = g[v][u] = 0;
    }
    if (judge()) {
        printf("Yes\n");
        for (int i = 1; i <= n; i++) {
            if (col[i] == 0) printf("a");
            else if (col[i] == 1) printf("c");
            else printf("b");
        }
        printf("\n");
    } else printf("No\n");
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a) for (int i = 0; i < (a); i++)
#define rep2(i, a, b) for (int i = (a); i < (b); i++)
#define repr(i, a) for (int i = (a) - 1; i >= 0; i--)
#define repr2(i, a, b) for (int i = (b) - 1; i >= (a); i--)
template<class T1, class T2> bool chmin(T1 &a, T2 b) { return b < a && (a = b, true); }
template<class T1, class T2> bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }
typedef long long ll;

struct UnionFind {
	vector<int> parent, size;
	UnionFind(int n) : parent(n), size(n, 1) {
		for (int i = 0; i < n; i++) {
			parent[i] = i;
		}
	}
	int operator[](int x) {
		if (parent[x] == x) return x;
		return parent[x] = (*this)[parent[x]];
	}
	bool merge(int x, int y) {
		x = (*this)[x]; y = (*this)[y];
		if (x == y) return false;
		if (size[x] > size[y]) swap(x, y);
		size[x] += size[y];
		parent[y] = x;
		return true;
	}
};

bool g[555][555];
int deg[555];
char ch[555];

int main() {
	int n, m;
	cin >> n >> m;
	rep(i, m) {
		int u, v;
		scanf("%d %d", &u, &v);
		u--; v--;
		g[u][v] = g[v][u] = true;
		deg[u]++;
		deg[v]++;
	}

	rep(i, n) {
		if (deg[i] == n - 1) ch[i] = 'b';
	}

	UnionFind uf(n);
	rep(i, n) rep(j, n) if (g[i][j] && ch[i] != 'b' && ch[j] != 'b') uf.merge(i, j);

	set<int> roots;
	rep(i, n) if (ch[i] != 'b') roots.insert(uf[i]);

	if (roots.size() >= 3) {
		cout << "No" << endl;
		return 0;
	}

	map<int, vector<int>> mp;
	rep(i, n) if (ch[i] != 'b') mp[uf[i]].push_back(i);

	for (auto kv : mp) {
		vector<int> v = kv.second;
		rep(i, v.size()) rep2(j, i + 1, v.size()) {
			if (!g[v[i]][v[j]]) {
				cout << "No" << endl;
				return 0;
			}
		}
	}

	vector<int> v(roots.begin(), roots.end());
	if (roots.size() == 1) {
		rep(i, n) if (uf[i] == v[0]) ch[i] = 'a';
	} else if (roots.size() == 2) {
		rep(i, n) if (uf[i] == v[0]) ch[i] = 'a';
		rep(i, n) if (uf[i] == v[1]) ch[i] = 'c';
	}

	cout << "Yes" << endl;
	rep(i, n) printf("%c", ch[i]);
	cout << endl;

	return 0;
}

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <vector>
#include<cctype>
#include<algorithm>
#include<set>
#include<stack>
#include<map>
#include<stdlib.h>
#include<ctime>
#include<iterator>
#include <deque>
#include <sstream>
#include<queue>
#include<cstdlib>
#include<bitset>

#define fn(i,n) for(int (i) = 0;(i) < (n);(i)++)
#define f1n(i,n) for(int (i) = 1;(i) <= (n);(i)++)
#define mk(f,s) make_pair((f),(s))

#define defV(dp,e) memset(dp,e,sizeof dp)

#define ri(n) scanf("%d",&n)
#define rl(n) scanf("%lld",&n)
#define rs(s) scanf("%s",s)

#define PI acos(1.0)

using namespace std;

typedef long long ll;
typedef pair<int ,int > pp;

typedef vector<int  > v1;
typedef vector<ll  > vl;
typedef vector<pp  > vpp;
typedef vector<bool  > vb;
typedef vector<char > vc;
typedef vector<v1 > v2;

typedef map<int ,int > mf;
typedef map<int ,vpp > mv;
typedef map<int ,v1 > ad;

int const siz = 1e9,bound = 1e5,mod = siz+7;
ll const cnt=1e18;

v2 adj;
int n,m;

char ee[501];
int main() {
//	freopen("o.txt","w",stdout);
//	freopen("in.txt","r",stdin);
//	ios::sync_with_stdio(0);
	fn(i,501)ee[i]='-';
	ri(n),ri(m);
	adj=v2(n+1);
	int bs=0,as=0,cs=0;
	fn(i,m){
		int a,b;
		ri(a),ri(b);
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	f1n(i,n)
		if(adj[i].size()==n-1){
			ee[i]='b';
			bs++;
		}

	f1n(i,n){
		if(ee[i]=='-'){
			ee[i]='a';
			as=1;
			fn(j,adj[i].size()){
				int u=adj[i][j];
				if(ee[u]=='-')
					ee[u]='a',as++;
			}
			break;
		}
	}

	f1n(i,n){
		if(ee[i]=='-'){
			ee[i]='c';
			cs=1;
			fn(j,adj[i].size()){
				int u=adj[i][j];
				if(ee[u]=='-')
					ee[u]='c',cs++;
				else if(ee[u]=='a'){
					puts("No");
					return 0;
				}
			}
			break;
		}
	}

	string ans;
//	cout<<as<<" "<<bs<<" "<<cs<<endl;
	f1n(i,n){
		if(ee[i]=='-'){
			puts("No");
			return 0;
		}else{
			if(ee[i]=='a'){
				if(adj[i].size()!=as+bs-1){
					puts("No");
					return 0;
				}
			}else if(ee[i]=='c'){
				if(adj[i].size()!=cs+bs-1){
					puts("No");
					return 0;
				}
			}
			ans+=ee[i];
		}
	}
	printf("Yes\n%s\n",ans.c_str());
	return 0;
}

#include<bits/stdc++.h>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iostream>
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
typedef long long int ll;
using namespace std;
const int M=1e9+7;
const int N=5e2+5;
#define fi first
#define se second
#define pb push_back
#define endl "\n"
ll n,m;
bool check[N][N];
string s;
ll cnt[N];
vector<ll> q;
char p='a';
void dfs(ll i)
{
    if(s[i-1]!='d')
    return ;
    for(ll j=0;j<q.size();++j)
    {
        if(!check[q[j]][i])
        {
            cout<<"No";
            exit(0);
        }
    }
    q.pb(i);
    s[i-1]=p;
    for(ll j=1;j<=n;++j)
    {
        if(check[i][j])
        dfs(j);
    }
}
int main()
{
    cin>>n>>m;
    for(ll i=0;i<n;++i)
    s+='d';
    while(m--)
    {
        ll u,v;cin>>u>>v;
        check[u][v]=1;
        check[v][u]=1;
        ++cnt[u];
        ++cnt[v];
    }
    for(ll i=1;i<=n;++i)
    {
        if(cnt[i]==n-1)
        s[i-1]='b';
    }
   // cout<<s<<endl;
   // char p='a';
    for(ll i=1;i<=n;++i)
    {
       if(s[i-1]=='d')
       {
           if(p=='e')
           {
               cout<<"No";
               exit(0);
           }
           q.clear();
           dfs(i);
           p+=2;
       }
    }
    cout<<"Yes"<<endl;
    cout<<s;
}

#include<bits/stdc++.h>
using namespace std;
vector<int> adj[501];

int c[501];
int num = 1;
bool vis[501];
int cnt[501];
int as, cs, bs;
int tmp;
void bfs(int u){
    tmp++;
    c[u] = num;
    if(num == 1) as++;
    else cs++;
    for(auto v: adj[u]){
        if(!vis[v]){
            vis[v] = 1;
            bfs(v);
        }
    }
}
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    c[0] = '-';
    int n, m; cin >> n >> m;
    for(int i = 0; i < m; ++i){
        int u, v; cin >> u >> v;
        adj[u].push_back(v); adj[v].push_back(u);
        cnt[u]++;
        cnt[v]++;
    }

    for(int i = 1; i <= n; ++i){
        if(cnt[i] == n - 1) {
            vis[i] = 1;
            c[i] = 2;
            bs++;
        }
    }
    for(int i = 1; i <= n; ++i){
        if(!vis[i]){
            vis[i] = 1;
            bfs(i);
            num += 2;
            if(num > 3) break;
        }
    }
    for(int i = 1; i <= n; ++i){
        if(!vis[i]){
            cout << "No\n";
            return 0;
        }
        if((c[i] == 1 && cnt[i] != as - 1 + bs) || (c[i] == 3 && cnt[i] != cs - 1 + bs)){
            cout << "No\n";
            return 0;
        }
    }
    cout << "Yes\n";
    for(int i = 1;i <= n; ++i){
        cout << char('a' + c[i] - 1);
    }
}

#include <iostream>
#include <cstdlib>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cstdio>
#include <cmath>
#include <utility>
#include <algorithm>
#include <iomanip>
const int INF = 0x3f3f3f3f;
#define ll long long int
#define ld long double
#define endl "\n"
using namespace std;
int n,m;
vector< vector<int> > graph;
vector<int> usados;
int erro=false;
void dfs(int atual, int cont){
  usados[atual]=cont;
  for(int i=0;i<n;i++){
    if(graph[atual][i]==1 and usados[i]==0) dfs(i,cont);
    else if(graph[atual][i]==1 and usados[i]==2 and cont==3){
      erro=true;
      return;
    }
  }
}
void verifica(){
  int na=0,nb=0,nc=0;
  for(int i=0;i<n;i++) {
    if(usados[i]==2) na++;
    if(usados[i]==1) nb++;
    if(usados[i]==3) nc++;
    if(usados[i]==0) erro=true;
  }
  for(int i=0;i<n;i++){
    int g=0;
    for(int j=0;j<n;j++){
      if(graph[i][j]) g++;
    }
    if(usados[i]==2 and g!= na-1+nb) erro= true;
    if(usados[i]==3 and g!= nc-1+nb) erro = true;
  }
}
int main()
{
  cin>>n>>m;
  graph.resize(n, vector<int>(n,0));
  usados.resize(n,0);
  for(int i=0;i<m;i++) {
    int a,b;
    cin>>a>>b;
    a--,b--;
    graph[a][b]=graph[b][a]=1;
  }
  for(int i=0;i<n;i++){
    int ocor=0;
    for(int j=0;j<n;j++){
      if(graph[i][j]==0) ocor++;
    }
    if(ocor==1) usados[i]=1;
  }
  int cont=2;
  for(int i=0;i<n;i++){
    if(usados[i]==0){
      dfs(i, cont);
      cont++;
    }
    if(cont==4) break;
  }
  verifica();
  if(erro) cout<<"No"<<endl;
  else{
    cout<<"Yes"<<endl;
    char oi[4]={'m','b','a','c'};
    for(int i=0;i<n;i++) cout<<oi[usados[i]];
    cout<<endl;
  }

  return 0;
}

/*
一个由a,b,c组成的字符串，可以这样生成一张图:
当s[i]与s[j]不是一个a一个c时，i与j连一条边。
给定生成的图，求是否存在字符串能生成这张图。
输出这个字符串。n<=500
*/
#include<bits/stdc++.h>
using namespace std;

const int maxn = 509;
int w[maxn][maxn], ans[maxn];
int n, m, u, v;

void dfs(int u){
	for (int i=1; i<=n; i++)
		if (w[u][i] && ans[i] == -1){
			ans[i] = !ans[u];
			dfs(i);
		}
		else if (w[u][i] && u != i && ans[i] == ans[u]){
			puts("No");
			exit(0);
		}
}

bool judge(int u){
	for (int i=1; i<=n; i++) if (w[u][i]) return true;
	return false;
}

bool check(){
	for (int i=1; i<=n; i++)
		for (int j=i+1; j<=n; j++)
			if (ans[i] + ans[j] == 1 && !w[i][j])
				return false;
	return true;
}

int main(){
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++){
		ans[i] = -1;
		for (int j=1; j<=n; j++)
			w[i][j] = 1;
		w[i][i] = 0;
	}
	for (int i=1; i<=m; i++){
		scanf("%d%d", &u, &v);
		w[u][v] = w[v][u] = 0;
	}
	for (int i=1; i<=n; i++)
		if (judge(i) && ans[i] == -1) { ans[i] = 1; dfs(i); }
	if (!check()) { puts("No"); return 0; }
	puts("Yes");
	for (int i=1; i<=n; i++)
		if (ans[i] == -1) putchar('b');
		else if (ans[i]) putchar('a');
		else putchar('c');
	return 0;
}

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 510;
int w[MAX_N][MAX_N], n, m, C[MAX_N];
void dfs(int a, int ck) {
	int i;
	C[a] = ck;
	for (i = 1; i <= n; i++) {
		if (!C[i] && w[a][i]) {
			dfs(i, 3 - ck);
		}
	}
}
int main() {
	int a, b, i, j, chk = 0;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (i != j)w[i][j] = 1;
		}
	}
	while (m--) {
		scanf("%d%d", &a, &b);
		w[a][b] = w[b][a] = 0;
	}
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= n; j++) {
			if (w[i][j] == 1)break;
		}
		if (j != n + 1)break;
	}
	if (i != n + 1) {
		dfs(i, 1);
		for (i = 1; i <= n; i++) {
			for (j = 1; j <= n; j++) {
				if (w[i][j] == 0 && C[i] + C[j] == 3)chk = 1;
				if (w[i][j] == 1 && C[i] + C[j] != 3)chk = 1;
			}
		}
	}
	if (chk) {
		printf("No\n");
	}
	else {
		printf("Yes\n");
		for (i = 1; i <= n; i++) {
			if (C[i] == 1)printf("a");
			else if (C[i] == 2)printf("c");
			else printf("b");
		}
	}
}

#include<bits/stdc++.h>

#define NN 555

using namespace std;

int adj[NN][NN];

char ans[NN];

int main(){

	int n,m,i,j,u,v;

	cin>>n>>m;

	for(i=0; i<m; i++){

		scanf("%d%d", &u, &v);

		adj[u][v]=adj[v][u]=1;

	}

	for(i=1; i<=n; i++){

		for(j=1; j<=n; j++){

			if(i==j || adj[i][j]) continue;

			if(ans[i]) {

				if(ans[j] && ans[i]==ans[j]) {puts("No"); return 0;}

				if(ans[j]) continue;

				else ans[j]='a'+'c'-ans[i];

			}

			else if(ans[j]) {

				if(ans[i]) continue;

				else ans[i]='a'+'c'-ans[j];

			}

			else ans[i]='a', ans[j]='c';

		}

	}

	for(i=1; i<=n; i++) if(!ans[i]) ans[i]='b';

	for(i=1; i<=n; i++){

		for(j=1; j<=n; j++){

			if(i==j) continue;

			if(adj[i][j] && ((ans[i]=='a' && ans[j]=='c') ||(ans[i]=='c' && ans[j]=='a'))) {puts("No"); return 0;}

			if(adj[i][j]==0 && (abs(ans[i]-ans[j])<2)) {puts("No"); return 0;}

		}

	}

	puts("Yes");

	puts(ans+1);

	return 0;

}

//----------------include---------------
#include <iostream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <stack>
#include <sstream>
#include <cstring>
#include <numeric>
#include <ctime>
#include <clocale>
#include <conio.h>

/*
Imagine Dragons - Warriors

As a child you would wait
And watch from far away.
But you always knew that you'd be the one
That work while they all play.

In youth you'd lay
Awake at night and scheme
Of all the things that you would change,
But it was just a dream!

Here we are, don't turn away now,
We are the warriors that built this town.
Here we are, don't turn away now,
We are the warriors that built this town
From dust.

Will come
When you'll have to rise
Above the best and prove yourself,
Your spirit never dies!

Farewell, I've gone to take my throne above,
But don't weep for me
'Cause this will be
The labor of my love

Here we are, don't turn away now,
We are the warriors that built this town.
Here we are, don't turn away now,
We are the warriors that built this town
From dust.

Here we are, don't turn away now,
We are the warriors that built this town.
Here we are, don't turn away now,
We are the warriors that built this town
From dust.
*/
//----------------define----------------
#define f(_i, _n) for (int _i = 0; _i < _n; _i++)
#define fr(_i, _n, _k) for (int _i = _k; _i < _n; _i++)
#define r(_t, _n) \
    _t _n; \
    cin >> _n;
#define ra(_type, _name, _len)\
_type _name[_len]; f(_i, _len)\
    cin >> _name[_len];

    #define pb push_back
#define re return
#define takedown re 0;
#define fi first
#define se second
#define inf(_name) freopen(_name, "r", stdin);
#define ouf(_name) freopen(_name, "w", stdout);
#define fill(a, b) memset(a, b, sizeof(a));
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;

const int MAX = 1e+9+9;
char c;
int a[550][550];
vector<int> v[550];
char s[500];
int cc[500];
int main(){
    int n, m, c, b;
    cin >> n >> m;
    f(i, m){
        cin >> c >> b;
        a[--c][--b] = 1;
        a[b][b]=a[c][c]=1;
        a[b][c] = 1;
    }
    f(i, n) a[i][i]=1;
    f(i, n){
        f(j, n){
        //    cout << a[i][j] << ' ';
            if(a[i][j]==0) v[i].pb(j);
        }
        //cout << endl;
    }
    f(i, n){
        if(v[i].size()==0) s[i]='b';
    }
    ll count = 0;
    f(i, n){
        if(s[i]==0){
            s[i]='c';
            count++;
        }
        //cout << s[i];
        if(s[i]=='c'){
            f(j, v[i].size()){
                //cout << v[i][j];
                int k = v[i][j];
                //cout << k << endl;
                //cout << i << ' ' << k;
                if(s[k]=='c'){
                    cout << "No";
                    re 0;
                }
                s[k] = 'a';
                cc[k]++;
            }
        }
    }
    bool tr = 0;
    f(i, n){
        if(s[i]=='a'){
            if(v[i].size()!=count){ tr = 1; break;}
            f(j, count){
                if(s[v[i][j]]!='c'){
                    tr = 1;
                    break;
                }
            }
        }
    }
    //cout << count;
    if(tr){
        cout << "No";
        re 0;
    }
    cout << "Yes\n";
    f(i, n){ cout << s[i]; }
}

#include<iostream>
#include<map>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<stack>
#include<math.h>
#include<set>
#include<string>
#include<cstring>
#include<queue>
#include<complex>
#include<cstdio>
#include<bitset>
using namespace std;

#define FilesX
#define TimeX
#define DEBUG

#ifdef DEBUG
#define DBG(x,s) cout<<s<<": "#x"="<<x<<"\n";
#else
#define DBG(x,s)
#endif
#define P(x) cout<<#x<<" = { "<<x<<" }\n"
#define All(a) (a).begin(), (a).end()
#define rep(i,n) for(int i=0;i<int(n);i++)
#define repd(i,n) for(int i=n-1;i>=0;i--)
#define repi(i,a,n) for(int i=int(a);i<int(n);i++)
#define foreach(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define clr(a, n) memset(a, n, sizeof(a));
#define scn(a,n) rep(i,n) cin>>a[o[0]];
#define scn2(a,row,col) rep(i,row) rep(j,col) cin>>a[o[0]][j];
#define prn(a,n) rep(i,n-1) cout<<a[o[0]]<<" "; cout<<a[n-1]<<endl;
#define prn2(a,row,col) rep(i,row){rep(j,col-1) cout<<a[o[0]][j]<<" "; cout<<a[o[0]][col-1]<<endl;}
#define dri(x) scanf("%d",&(x))
#define drii(x,y) scanf("%d%d",&(x),&(y))
#define drl(x) scanf("%I64d",&(x))
#define drll(x,y) scanf("%I64d%I64d",&(x),&(y))
#define mp(a, b) make_pair(a, b)
#define Odd(x) x%2!=0
#define Even(x) x%2==0
#define PI 3.1415926535897932384626433832795
#define INF 1e9 + 10
#define LLINF 1e18 + 10
const double EPS = (1e-7);
int dcmp(double x, double y) { return fabs(x-y) <= EPS ? 0 : x < y ? -1 : 1; }

typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<long> vl;
typedef vector<ll> vll;
typedef vector<double> vd;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef pair<int, string> is;
typedef vector<pii> vii;

ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
ll lcm(ll a, ll b) { return (a * (b / gcd(a, b))); }
bool in_range(int i, int j, int n, int m) { return i >= 0 && i < n && j >= 0 && j < m; }

//*---------------------------*/

int n, m;
vector<vi >adj;

vi dfs_num, dfs_low, S, visited; // global variables
int dfsNumberCounter, numSCC;
vector<vi > SCC;

int b[555];
void tarjanSCC(int u) {
	dfs_low[u] = dfs_num[u] = dfsNumberCounter++; // dfs_low[u] <= dfs_num[u]
	S.push_back(u); // stores u in a vector based on order of visitation
	visited[u] = 1;
	for (int j = 0; j < (int)adj[u].size(); j++) {
		int v = adj[u][j];
		if (b[v])continue;
		if (dfs_num[v] == -1)
			tarjanSCC(v);
		if (visited[v]) // condition for update
			dfs_low[u] = min(dfs_low[u], dfs_low[v]); }
	if (dfs_low[u] == dfs_num[u]) { // if this is a root (start) of an SCC
		//printf("SCC %d:", ++numSCC); // this part is done after recursion
		while (1) {
			int v = S.back(); S.pop_back(); visited[v] = 0;
			//printf(" %d", v);
			SCC[numSCC].push_back(v);
			if (u == v) break;
		}
		numSCC++;
	}
}

int a[555][555];

bool check(string s){
	rep(i, n)
		repi(j, i+1, n)
			if (abs(s[i] - s[j]) <= 1 && (!a[i][j] || !a[j][i]))
				return false;
	rep(i, n)
		rep(j, n)
			if (a[i][j] && abs(s[i] - s[j]) > 1)
				return false;
	return true;
}

void solution(){
	cin>>n>>m;
	adj = vector<vi >(n);
	SCC = vector<vi >(n);
	rep(i, m){
		int x, y;
		cin>>x>>y;
		x--; y--;
		adj[x].push_back(y);
		adj[y].push_back(x);
		a[x][y] = 1;
		a[y][x] = 1;
	}

	rep(i, n){
		rep(j, n){
			rep(k, n){
				if ((a[i][j] && a[i][k] && !a[j][k]) && (i != j && j != k)){
					b[i] = 1;
				}
			}
		}
	}

	dfs_num.assign(n, -1); dfs_low.assign(n, 0); visited.assign(n, 0);
	dfsNumberCounter = numSCC = 0;
	for (int i = 0; i < n; i++)
		if (dfs_num[i] == -1 && !b[i])
			tarjanSCC(i);
	rep(i, numSCC){
		rep(j, SCC[i].size()){
			rep(k, j+1, SCC[i].size()){
				if ((!a[SCC[i][j]][SCC[i][k]] || !a[SCC[i][k]][SCC[i][j]]) && (SCC[i][k] != SCC[i][j])){
					cout<<"NO";
					return;
				}
			}
		}
	}
	if (numSCC == 1){
		string s = "";
		rep(i, n) s += 'a';
		if (!check(s)) cout<<"NO";
		else cout<<"YES\n"<<s;
	}
	else if (numSCC == 2){
		string s = "";
		rep(i, n) s += 's';
		rep(i, SCC[0].size()) s[SCC[0][i]] = 'a';
		rep(i, SCC[1].size()) s[SCC[1][i]] = 'c';
		rep(i, n) if (b[i]) s[i] = 'b';
		if (!check(s)) cout<<"NO";
		else cout<<"YES\n"<<s;
	}
	else cout<<"NO";
}

//*---------------------------*/
int main(){
	#ifdef Files
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif
	double beg=clock();

	ios::sync_with_stdio(false);
	solution();

	#ifdef Time
	cout << endl;
	double end=clock();
	printf("*** Total time = %.3f sec ***", (end - beg) / CLOCKS_PER_SEC);
	#endif
	return 0;
}

/*
                                                     _         _   _
                                                    (_)       | | | |
 _ __  _ __ ___   __ _ _ __ __ _ _ __ ___  _ __ ___  _ ___ ___| |_| |_
| '_ \| '__/ _ \ / _` | '__/ _` | '_ ` _ \| '_ ` _ \| / __/ __| __| __|
| |_) | | | (_) | (_| | | | (_| | | | | | | | | | | | \__ \__ \ |_| |_
| .__/|_|  \___/ \__, |_|  \__,_|_| |_| |_|_| |_| |_|_|___/___/\__|\__|
| |               __/ |
|_|              |___/

*/

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("Ofast")
//#pragma optimize("O3")

typedef long long ll;
typedef unsigned long long ull;

using namespace std;
using namespace __gnu_pbds;

#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ff first
#define ss second
#define ss1 second.first
#define ss2 second.second
#define forn(i, n) for(int i=0;i<n;i++)
#define fore(i, l, r) for(int i=l;i<r;i++)
#define pi pair<int,int>
#define pl pair<ll,ll>
#define vi vector<int>
#define vpi vector<pi>
#define gcd(a,b) __gcd(a,b)
#define FASTIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define smp(x,y) {min(x,y),max(x,y)}
#define sqr(x) ((x)*(x))
#define newstr cout << "\n"
#define call(a) {for(auto xxx:a)cout<<xxx<<" ";cout<<"\n";}
#define FILE
const string alf = "abcdefghijklmnopqrstuvwxyz";
const int hashP = 239017;
const int N = 1e5+10;
const int MOD = 1e9 + 7;
const int MOD2 = 998244353;
const int INF = 1e9;
const ll oo = 9e18;

template<typename T>
bool umn(T &a, T b) { return (a > b ? (a = b, 1) : 0); }
template<typename T>
bool umx(T &a, T b) { return (a < b ? (a = b, 1) : 0); }

template<typename T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; // order_of_key    find_by_order

void solve() {
    ll n,m;
    cin >> n >> m;
    set<pl> s;
    for(int i=0;i<m;i++) {
        ll u,v;
        cin >> u >> v;
        s.insert(smp(u,v));
    }
    vector <ll> st(n,0);
    for(int i=0;i<n;i++) {
        for(int j=i+1;j<n;j++) {
            if(s.find({i+1,j+1})==s.end()) {
                if(st[i]==0) {
                    if(st[j]==0) {
                        st[i]=1;
                        st[j]=3;
                    } else {
                        st[i]=(st[j]==1?3:1);
                    }
                } else {
                    if(st[j]==0) {
                        st[j]=(st[i]==1?3:1);
                    } else {
                        if(st[i]==st[j]) {
                            cout << "No";
                            return;
                        }
                    }
                }
            }
        }
    }

    auto good = [&](ll l, ll r) {
        if(l==r||l+1==r||l-1==r) return 1; else return 0;
    };

    for(auto& now : st) if(now==0) now=2;
    for(int i=0;i<n;i++) {
        for(int j=i+1;j<n;j++) {
            if(good(st[i],st[j])) {
                if(s.find({i+1,j+1})==s.end()) {
                    cout << "No";
                    return;
                }
            } else {
                if(s.find({i+1,j+1})!=s.end()) {
                    cout << "No";
                    return;
                }
            }
        }
    }

    cout << "Yes\n";
    for(auto now : st) cout << char('a'+now-1);
}

int main() {

    FASTIO;

#ifndef FILE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif

    ll tt;
    tt=1;
   // cin >> tt;

    while(tt--) {
        solve();
    }

    return 0;
}
/**
tests
************

8 3
1 0 3 1
1 5 8 1
2 0 8

6
4 1
4 1
4 1
5 1
1 4
2 5

************
**/

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <tuple>
using namespace std;
typedef long long ll;
typedef double ld;
typedef pair<int,int> P;

typedef vector<int> Tree;
int find(Tree &tree,int n){
	if(tree[n]<0)
		return n;
	else
		return tree[n]=find(tree,tree[n]);
}
bool uni(Tree &tree,int n1,int n2){
	n1=find(tree,n1);
	n2=find(tree,n2);
	if(n1==n2)
		return true;
	if((tree[n1]<-1 && tree[n2]<-1) && abs(tree[n1]-tree[n2])>=2)
		return false;
	if(tree[n1]<tree[n2])
		tree[n2]=n1;
	else if(tree[n1]>tree[n2])
		tree[n1]=n2;
	else{
		tree[n2]=n1;
	}
	return true;
}

int main(){
	int n,m;
	cin >> n >> m;
	set<P> aru;
	set<P> nai;
	for(int i=0;i<m;i++){
		int u,v;
		cin >> u >> v;
		u--; v--;
		aru.insert(P(min(u,v),max(u,v)));
	}
	set<int> not;
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			if(aru.find(P(i,j))==aru.end()){
				nai.insert(P(i,j));
				not.insert(i);
				not.insert(j);
			}
		}
	}
	Tree t(n,-1);
	if(nai.empty()){
		string ans(n,'a');
		cout << "Yes" << endl;
		cout << ans << endl;
		return 0;
	}else{
		auto i=nai.begin();
		t[i->first]=-'a';
		t[i->second]=-'c';
	}
	for(auto i=aru.begin();i!=aru.end();i++){
		if(not.find(i->first)!=not.end() && not.find(i->second)!=not.end()){
			if(!uni(t,i->first,i->second)){
				cout << "No" << endl;
				return 0;
			}
		}
	}
	bool flag=true;
	while(flag){
		flag=false;
		for(auto i=nai.begin();i!=nai.end();i++){
			if(t[i->first]==-1){
				if(t[i->second]==-1){
					flag=true;
					continue;
				}else if(t[find(t,i->second)]==-'a')
					t[i->first]=-'c';
				else
					t[i->first]=-'a';
			}else if(t[i->second]==-1){
				if(t[find(t,i->first)]==-'a')
					t[i->second]=-'c';
				else
					t[i->second]=-'a';
			}else if(t[find(t,i->first)] == t[find(t,i->second)]){
				cout << "No" << endl;
				return 0;
			}
		}
	}

	cout << "Yes" << endl;
	for(int i=0;i<n;i++)
		if(t[find(t,i)]==-1)
			cout << 'b';
		else if(t[find(t,i)]==-'a')
			cout << 'a';
		else if(t[find(t,i)]==-'c')
			cout << 'c';
	cout << endl;
	return 0;
}
/*
4 4
1 2
1 3
1 4
3 4

*/

#include <iostream>
#include <cmath>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;
int mp[510][510];
char ans[510];//答案

int n, m, out;
//n个点, m条边

void dfs(int i) {//二分图染色(复制粘贴)
	for (int s = 0; s < n; s++) {
		if (i != s && mp[s][i] == 0 && ans[s] == ans[i]) {
			//该边没连但是撞了
			out = 1;
			return;
		}
		if (i != s && mp[s][i] == 1 &&//有边但是答案没有
			(
			(ans[s] == 'a' && ans[i] == 'c') || (ans[s] == 'c' && ans[i] == 'a')
			)
		   ) {
			out = 1;
			return;
		}
		if (i != s && mp[s][i] == 0 && ans[s] == 0) {
			if (ans[i] == 'a') {
				ans[s] = 'c';
			} else{
				ans[s] = 'a';
			}
			dfs(s);
		}
		if (i != s && mp[s][i] == 1 && ans[s] == 0) {
			if (ans[i] == 'a') {
				ans[s] = 'a';
			} else{
				ans[s] = 'c';
			}
			dfs(s);
		}
		//两种染色方法都试试
	}
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int a, b;
		cin >> a >> b;
		mp[a - 1][b - 1] = 1;//字符串位置-1
		mp[b - 1][a - 1] = 1;
		//存图
	}
	for (int i = 0; i < n; i++) {
		int flag = 0;
		for (int j = 0; j < n; j++) {
			if (mp[i][j] == 0 && j != i) {
				//没有边
				flag = 1;//说明这两个点是a/c
			}
		}
		if (flag == 0) {
			ans[i] = 'b';
		}
	}
	for (int i = 0; i < n; i++) {
		if (ans[i] == 0) {
			ans[i] = 'a';
			dfs(i);
		}
	}
	if (out == 1) {
		cout << "No\n";
		return 0;
	}
	cout << "Yes\n";
	cout << ans;
}

//题意：匹配的字符串是严格按规则连边的, 不存在漏边的情况

//#pragma GCC optimize("Ofast")
//#pragma comment(linker, "/STACK: 20000000")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
//#define ll __int128
#define vec vector
#define all(x) x.begin(), x.end()
#define deb(x) cerr<<#x<<" = "<<x<<endl
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

int main(){IOS;
  int n,m;cin>>n>>m;
  vec<set<int>> g(n);
  while(m--){
    int a,b;cin>>a>>b;a--;b--;
    g[a].insert(b);g[b].insert(a);
  }
  set<int> b_candidates, a_candidates, c_candidates;
  for(int i=0;i<n;i++){
    if( g[i].size()+1==n )b_candidates.insert(i);
  }
  int a=-1;
  for(int i=0;i<n;i++){
    if( b_candidates.count(i)==0 ){
      a=i;break;
    }
  }
  if(a!=-1){
    a_candidates.insert(a);
    for(auto&v:g[a]){
      if(b_candidates.count(v))continue;
      a_candidates.insert(v);
    }
  }
  for(int i=0;i<n;i++){
    if(a_candidates.count(i)==0 && b_candidates.count(i)==0)
      c_candidates.insert(i);
  }
  if((a_candidates.size()+b_candidates.size()+c_candidates.size()!=n)){cout<<"No"<<endl;return 0;}
  for(auto&v:a_candidates){
    for(auto&vv:g[v]){
      if(c_candidates.count(vv)){cout<<"No"<<endl;return 0;}
    }
    if( g[v].size()+1 != a_candidates.size()+b_candidates.size() ){cout<<"No"<<endl; return 0;}
  }
  for(auto&v:c_candidates){
    for(auto&vv:g[v]){
      if(a_candidates.count(vv)){cout<<"No"<<endl;return 0;}
    }
    if( g[v].size()+1 != c_candidates.size()+b_candidates.size() ){cout<<"No"<<endl; return 0;}
  }
  cout<<"Yes"<<endl;
  vec<char> ans(n);
  for(auto&c:a_candidates)ans[c]='a';
  for(auto&c:b_candidates)ans[c]='b';
  for(auto&c:c_candidates)ans[c]='c';
  for(auto&c:ans)cout<<c;cout<<endl;
}

#include <bits/stdc++.h>

using namespace std;

const int N = 505;
map<vector<int>,int> Hash;

vector<int>v[N];

int ret[N];
bool vis[N];

vector<int> order;

int adj[5][5];

void dfs(int x){
    vis[x]= 1;
    int i;
    for(i=0;i<3;++i)
        if(adj[x][i] && !vis[i])
            dfs(i);
    order.push_back(x);
}

int color[5],Cos=0;
void dfs2(int x){
    vis[x]= 1;
    int i;
    color[x]= Cos++;
    for(i=0;i<3;++i)
        if(adj[x][i] && !vis[i]){
            dfs2(i);
        }
}
void solve(){
    int n,m,i,j,a,b;
    cin>>n>>m;

    for(i=0;i<m;++i){
        scanf("%d%d",&a,&b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(i=1;i<=n;++i)v[i].push_back(i),sort(v[i].begin(),v[i].end()),Hash[v[i]];
    if(Hash.size()>3){
        cout<<"No\n";return;
    }
    else{
        map<vector<int>,int>::iterator it;
        int pos=0;
        for(it= Hash.begin();it!= Hash.end();++it)
            it->second = pos++;
        for(i=1;i<=n;++i){
           ret[i]= Hash[v[i]];
        }
        for(i=1;i<=n;++i){
            for(j=0;j<v[i].size();++j){
                a = ret[v[i][j]];
                adj[ret[i]][a]= 1;
                adj[a][ret[i]]= 1;
            }
        }

        for(i=0;i<pos;++i)
            if(!vis[i])
             dfs(i);

        memset(vis,0,sizeof(vis));
        for(i=0;i<order.size();++i){
            if(!vis[order[i]])
                dfs2(order[i]),++Cos;
        }
        for(i=0;i<order.size();++i)
            if(color[order[i]]>2){
                cout<<"No\n";return;
            }
        cout<<"Yes\n";
        for(i=1;i<=n;++i)putchar(char('a'+color[ret[i]]));
        cout<<endl;
    }
}

int main(){
    solve();
}

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

int main() {
	ios_base::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	vector<vector<bool>> graph(n, vector<bool>(n, 0));
	string s(n, 'c');
	for(int i, j; cin >> i >> j; ) {
		graph[i - 1][j - 1] = 1;
		graph[j - 1][i - 1] = 1;
	}
	for(auto i = 0; i != n; i++) {
		bool all = true;
		for(auto j = 0; j != n; j++) {
			if(j != i && graph[i][j] == 0) {
				all = false;
			}
		}
		if(all) {
			s[i] = 'b';
		}
	}
	for(auto i = 0; i != n; i++) {
		if(s[i] != 'b') {
			stack<int> stack;
			stack.emplace(i);
			while(!stack.empty()) {
				auto top = stack.top();
				s[top] = 'a';
				stack.pop();
				for(auto j = 0; j != n; j++) {
					if(graph[i][j] && s[j] == 'c') {
						stack.emplace(j);
					}
				}
			}
			break;
		}
	}
	for(auto i = 0; i != n; i++) {
		for(auto j = i + 1; j < n; j++) {
			if((s[i] == s[j] || s[i] == s[j] + 1 || s[j] == s[i] + 1) && graph[i][j] == false || graph[i][j] && (s[i] =='a' && s[j] == 'c' || s[i] == 'c' && s[j] == 'a')) {
				cout << "No";
				return 0;
			}
		}
	}
	cout << "Yes" << endl << s;
	return 0;
}

#include<bits/stdc++.h>

using namespace std;

#define fr(i, n) for(int i = 0; i < n; i++)
#define frr(i, n) for(int i = 1; i <= n; i++)
#define frm(i, n) for(int i = n-1; i >= 0; i--)

#define pb push_back
#define erase(i) erase(v.begin() + i, v.begin() + i + 1)
typedef pair<int,int> pii;

#define mem(v, k) memset(v, k, sizeof(v));

#define mp make_pair
#define pq priority_queue

#define ll long long

#define MAXN 510

int n, m;
vector<int> adj[MAXN];
int processado[MAXN];
char s[MAXN];
vector<int> AB[3];

void dfs(int v, char c){
	processado[v] = 1;

	fr(i, adj[v].size()){
		int e = adj[v][i];

		if(processado[e] == -1 && adj[e].size() < n-1){
			AB[int(c) - 97].pb(e);
			dfs(e, c);
			s[e] = c;
//			cout << "v "<< v << " e " << e << " x "<<x <<endl;
		}
	}
}

int main(){
	cin >> n >> m;

	fr(i, m){
		int v1, v2;
		cin >> v1>> v2;

		adj[v1].pb(v2);
		adj[v2].pb(v1);
	}

	frr(i, n){
		if(adj[i].size() == n-1) {
			s[i] = 'b';
			AB[1].pb(i);
		}
	}

	int a = -1, c = -1, x = 1;
	mem(processado, -1);
	frr(i, n){
		if(a == -1 && processado[i] == -1 && adj[i].size() < n-1){
			//cout << "a " << i << endl;
			a = adj[i].size();
			dfs(i,'a');
			s[i] = 'a';
			AB[0].pb(i);
		}
		else if(c == -1 && processado[i] == -1 && adj[i].size() < n-1){
			//cout << "c " << i << endl;
			c = adj[i].size();
			dfs(i,'c');
			s[i] = 'c';
			AB[2].pb(i);
		}
		else if(processado[i] == -1 && adj[i].size() < n-1) x = 0;
	}

	fr(i, AB[0].size()){
		if(adj[AB[0][i]].size() != AB[0].size() - 1 + AB[1].size()) x = 0;
	}

	fr(i, AB[2].size()){
		if(adj[AB[2][i]].size() != AB[2].size() - 1 + AB[1].size()) x = 0;
	}

	if(x){
		cout << "Yes" << endl;
		frr(i, n) cout << s[i];
	}
	else{
		cout<< "No" << endl;
	}
}

//I love elene <3
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include<iomanip>
#define mod7 %1000000007
#define LL long long

using namespace std;
LL d, n,x,y,m, sum;
int g[501][501], viz[501];
vector<pair<int, int> > p;
int val[501], cnt = 0;
int g2[501][501];
int comp;
void dfs(int v) {
	val[v] = comp;
	for (int i = 1; i <= n; i++)
		if (val[i] == 0 && g[v][i])
			dfs(i);
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> x >> y;
		g[x][y] = g[y][x] = 1;

	}
	for (int i = 1; i <= n; i++)
		for (int j =1; j <= n; j++) {
			if (j!=i)
			for (int k = 1; k <= n; k++) {
				if (k!=i && k!=j)
				if (g[i][j] && g[j][k] && !g[k][i]) {
					val[j] = 2;
				}
			}
		}

	for (int i = 1; i <= n; i++) {
		if (val[i]==2) continue;
		if (val[i] == 0) {
			if (comp == 0)
				comp = 1;
			else {
				if (comp == 1) comp = 3;
				else {
					cout << "No\n";
					return 0;
				}
			}
			dfs(i);
		}

	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (j == i) continue;
			if (abs(val[i]-val[j])>1 && g[i][j]==1) {
				cout << "No\n";
				return 0;
			}

			if (abs(val[i] - val[j])<=1 && g[i][j] == 0) {
				cout << "No\n";
				return 0;
			}
		}
	}
	cout << "Yes\n";
	for (int i = 1; i <= n; i++)
	{
		if (val[i] == 1) cout << 'a';
		else if (val[i] == 2) cout << 'b';
		else cout << 'c';
	}

	return 0;
}

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <set>
#include <string>
#include <queue>
#include <stack>
using namespace std;
typedef long long mt;
#define rep(a, b, i) for(register mt i = a; i < b; ++i)
#define repe(a, b, i) for(register mt i = a; i <= b; ++i)
#define repd(a, b, i) for(register mt i = a; i > b; --i)
#define repde(a, b, i) for(register mt i = a; i >= b; --i)

#define N 510
#define M (1ll << 22)
#define INF 1000000000000000007//1e18 + 7
#define MOD 1000000007//1e9 + 7
#define EPS 1e-9

mt n, m;
bool g[N][N];
mt ck[N];
char s[N];
char dc[3] = { 'a','c', 0 };
mt d, r;

void dfs(mt p, mt v, char ch)
{
	s[v] = ch;
	repe(1, n, i)
		if (g[v][i] != g[p][i])
			r = 10;

	repe(1, n, i)
		if (g[v][i] && !s[i])
			dfs(v, i, ch);
		else if (!g[v][i] && s[i] == 'b')
			r = 10;
}

int main()
{
#ifdef _DEBUG
	freopen("in.txt", "r", stdin);
#endif
	mt u, v;
	scanf("%I64d %I64d", &n, &m);
	while (m--)
		scanf("%I64d %I64d", &u, &v), g[u][v] = g[v][u] = g[u][u] = g[v][v] = true, ++ck[u], ++ck[v];
	repe(1, n, i)
		if (ck[i] == n - 1)
			s[i] = 'b';
	repe(1, n, i) {
		if (!s[i]) {
			++r;
			if(d < 2)
				dfs(i, i, dc[d++]);
		}
	}
	if (r > 2) puts("No");
	else puts("Yes"), puts(s + 1);

	return 0;
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <stack>
#include <bitset>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include<queue>
#include<vector>
using namespace std;
int ans[510],n,m;
vector<int>arr[510];
bool book[510][510];
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		book[i][i] = 1;
	for (int i = 1; i <= m; i++)
	{
		int a, b;
		cin >> a >> b;
		arr[a].push_back(b);
		arr[b].push_back(a);
		book[a][b] = 1;
		book[b][a] = 1;
	}
	for (int i = 1; i <= n; i++)
	{
		if (arr[i].size() == n - 1)
			ans[i] = 2;
	}
	int shu = 0;
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] == 0)
		{
			if (shu == 0)
			{
				ans[i] = 1;
				for (int j = 0; j < arr[i].size(); j++)
				{
					int temp = arr[i][j];
					if (!ans[temp])
						ans[temp] = 1;
				}
				shu++;
			}
			else if (shu == 1)
			{
				ans[i] = 3;
				for (int j = 0; j < arr[i].size(); j++)
				{
					int temp = arr[i][j];
					if (!ans[temp])
						ans[temp] = 3;
					else if (ans[temp] == 1)
					{
						shu=3;
						break;
					}
				}
				shu++;
			}
			else
			{
				shu=3;
				break;
			}
		}
	}
	for (int i = 1; i <= n; i++)
	{
		if (shu > 2)
			break;
		if (ans[i] != 2)
		{
			for (int j = 1; j <= n; j++)
			{
				if (ans[i] == ans[j])
				{
					if (!book[i][j])
					{
						shu = 3;
						break;
					}
				}
				else if (ans[j]!=2&&book[i][j])
				{
					shu = 3; break;
				}
			}
		}
	}
	if (shu > 2)
		cout << "No" << endl;
	else
	{
		cout << "Yes" << endl;
		for (int i = 1; i <= n; i++)
			printf("%c", ans[i] - 1 + 'a');
		cout << endl;
	}
	return 0;
}

//
//  Created by TaoSama on 2016-02-05
//  Copyright (c) 2016 TaoSama. All rights reserved.
//
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>

using namespace std;
#define pr(x) cout << #x << " = " << x << "  "
#define prln(x) cout << #x << " = " << x << endl
const int N = 5e2 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;

int n, m;
int g[N][N], col[N];
char ans[N];
vector<int> G[N];

bool dfs(int u, int c) {
    col[u] = c;
    for(int v : G[u]) {
        if(col[v] == col[u]) return false;
        if(!col[v] && !dfs(v, -c)) return false;
    }
    return true;
}

int main() {
#ifdef LOCAL
    freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);
//  freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);
#endif
    ios_base::sync_with_stdio(0);

    while(scanf("%d%d", &n, &m) == 2) {
        memset(g, 0, sizeof g);
        for(int i = 1; i <= m; ++i) {
            int u, v; scanf("%d%d", &u, &v);
            g[u][v] = g[v][u] = 1;
        }
        for(int i = 1; i <= n; ++i) {
            G[i].clear();
            for(int j = 1; j <= n; ++j)
                if(i != j && !g[i][j]) G[i].push_back(j);
        }

        bool yes = true;
        memset(col, 0, sizeof col);
        for(int i = 1; i <= n; ++i) {
            if(!col[i] && G[i].size() && !dfs(i, 1)) {
                yes = false;
                break;
            }
        }
//        for(int i = 1; i <= n; ++i) printf("col[%d]=%d\n", i, col[i]);
//        printf("col : %d\n", yes);
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= n; ++j) {
                if(i == j) continue;
                if(g[i][j] && col[i] * col[j] < 0) yes = false;
                if(!g[i][j] && col[i] * col[j] >= 0) yes = false;
            }
        }

        if(!yes) {puts("No"); continue;}
        puts("Yes");
        for(int i = 1; i <= n; ++i) putchar("abc"[col[i] + 1]);
        puts("");
    }
    return 0;
}

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

int N, M;
vector<int> G[500 + 10];
char C[500 + 10];
int AA, BB, CC;

void dfs(int u) {
   if(C[u]) return;
   C[u] = 'a';
   for(int v : G[u]) dfs(v);
}

bool ok() {
   bool yes = true;
   for(int u = 1; u <= N; u++) {
      int a = 0, b = 0, c = 0;
      for(int v : G[u]) {
         if(C[v] == 'a') a++;
         else if(C[v] == 'b') b++;
         else c++;
      }
      if(C[u] == 'a') yes &= a == (AA-1) && b == BB && c == 0;
      if(C[u] == 'b') yes &= a == AA && c == CC && b == (BB-1);
      if(C[u] == 'c') yes &= a == 0 && b == BB && c == (CC-1);
   }
   return yes;
}

int main() {
   scanf("%d%d", &N, &M);
   for(int i = 0; i < M; i++) {
      int u, v; cin >> u >> v;
      G[u].push_back(v);
      G[v].push_back(u);
   }
   int mx = N - 1;
   int U = 0;
   for(int u = 1; u <= N; u++) {
      if(int(G[u].size()) == mx) {
         C[u] = 'b';
      } else {
         U = u;
      }
   }
   dfs(U);
   for(int u = 1; u <= N; u++) if(C[u] == 0) C[u] = 'c';
   for(int u = 1; u <= N; u++) {
      if(C[u] == 'a') AA++;
      else if(C[u] == 'b') BB++;
      else CC++;
   }
   if(ok()) {
      cout << "Yes\n";
      cout << (C+1) << "\n";
   } else {
      cout << "No\n";
   }
}

#include <bits/stdc++.h>

using namespace std;

const int N = 2e6, MOD = 1e9 + 7;
const long double EPS = 0.000000001;

#define int long long

int n, m;
map <int, char> color;
vector <int> g[N];
bool ok = false, used[N];

void dfs(int v) {
	used[v] = 1;
	for (auto to : g[v]) {
		if (!used[to]) dfs(to);
	}
	set <char> s;
	for (auto to : g[v]) {
		s.insert(color[to]);
	}
	if (color[v] == 'a') {
		if (s.find('c') != s.end()) {
			cout << "No";
			exit(0);
		}
	}
	if (color[v] == 'c') {
		if (s.find('a') != s.end()) {
			cout << "No";
			exit(0);
		}
	}
}

signed main() {

	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) color[i] = 'z';
	for (int i = 0; i < m; i++) {
		int l, r;
		cin >> l >> r;
		g[l].push_back(r);
		g[r].push_back(l);
	}
	for (int i = 1; i <= n; i++) {
		if (g[i].size() + 1 == n) {
			color[i] = 'b';
		}
	}
	set <int> s, s2;
	for (int i = 1; i <= n; i++) {
		if (color[i] == 'z') {
			color[i] = 'a';
			s2.insert(i);
			for (auto to : g[i]) {
				if (color[to] == 'z') color[to] = 'a', s2.insert(to);
			}
			break;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (color[i] == 'z') color[i] = 'c', s.insert(i);
	}
	if (!s.empty()) {
		for (auto o : s) {
			set <int> s1 = s;
			for (auto to : g[o]) {
				if (s1.find(to) != s1.end()) {
					s1.erase(to);
				}
			}
			if (s1.size() > 1) {
				cout << "No";
				return 0;
			}
		}
	}
	if (!s2.empty()) {
		for (auto o : s2) {
			set <int> s1 = s2;
			for (auto to : g[o]) {
				if (s1.find(to) != s1.end()) {
					s1.erase(to);
				}
			}
			if (s1.size() > 1) {
				cout << "No";
				return 0;
			}
		}
	}
	dfs(1);
	cout << "Yes\n";
	for (int i = 1; i <= n; i++) {
		cout << color[i];
	}
}

#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define st string
#define fr first
#define se second

const ll mod=1000000007;

using namespace std;

ll us[555][555];
char s[555];
string ans="Yes";

void f(ll x, ll y)
{
    if(s[x]=='.')
    {
        if(s[y]=='.')
        {
            s[x]='a';
            s[y]='c';
        }
        else if(s[y]=='a')
            s[x]='c';
        else if(s[y]=='c')
            s[x]='a';
    }
    else if(s[x]=='a')
    {
        if(s[y]=='a')
            ans="No";
        else
            s[y]='c';
    }
    else if(s[x]=='c')
    {
        if(s[y]=='c')
            ans="No";
        else
            s[y]='a';
    }
}

bool prov(ll n)
{
    for(ll i=1; i<=n; i++)
    {
        for(ll j=i+1; j<=n; j++)
        {
            if(us[i][j])
            {
                if(s[i]==s[j] || abs(int(s[i])-int(s[j]))==1)
                    continue;
                return false;
            }
        }
    }
    return true;
}

int main()
{
    //freopen("1.txt", "r", stdin);
    //freopen("1.txt", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

    ll n, m;
    cin>>n>>m;

    for(ll i=1; i<=m; i++)
    {
        ll x, y;
        cin>>x>>y;

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

    fill(s, s+n+1, '.');
    for(ll i=1; i<=n; i++)
    {
        for(ll j=i+1; j<=n; j++)
        {
            if(!us[i][j])
            {
                f(i, j);
                if(ans=="No")
                {
                    cout<<ans;
                    return 0;
                }
            }
        }
    }

    for(ll i=1; i<=n; i++)
        if(s[i]=='.')
            s[i]='b';

    if(prov(n))
    {
        cout<<"Yes\n";
        for(ll i=1; i<=n; i++)
            cout<<s[i];
    }
    else
        cout<<"No";
    return 0;
}
/*
*/

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;

vector<int> G[503];
bool visit[503];

int p[503];
int num[503];
int ans[503];
int line_num[503];

int find(int x) {
	if(p[x] == x) return x;
	return p[x] = find(p[x]);
}

void uni(int x, int y) {
	int fx = find(x);
	int fy = find(y);

	if(fx != fy) {
		p[fx] = fy;
		num[fy] += num[fx];
		num[fx] = 0;
	}
}

int main() {

	int n,m;
	cin >> n >> m;
	for(int i=0;i<m;i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		G[a].push_back(b);
		G[b].push_back(a);
	}

	memset(visit, false, sizeof(visit));
	for(int i=1;i<=n;i++)
		if(G[i].size() == n-1) visit[i] = true;

	for(int i=1;i<=n;i++) {
		p[i] = i;
		num[i] = 1;
	}

	for(int i=1;i<=n;i++)
		if(!visit[i]) {
			line_num[i] = G[i].size();
			for(int j=0;j<G[i].size();j++)
				if(!visit[G[i][j]]) uni(i, G[i][j]);
				else line_num[i]--;
		}

	vector<int> v[503];
	set<int> s;

	int c = 0;
	int give[503];
	for(int i=1;i<=n;i++)
		if(!visit[i] && num[i] > 0)
			give[i] = c++;

	for(int i=1;i<=n;i++)
		if(!visit[i])
		{
			s.insert(find(i));
			v[find(i)].push_back(i);
		}

	memset(ans, 0, sizeof(ans));
	if(s.size() > 2) cout << "No" << endl;
	else {
		int suc = 1;
		for(int i=1;i<=n;i++)
			if(v[i].size() > 0)
				for(int j=0;j<v[i].size();j++) {
					ans[v[i][j]] = give[i];
					if(line_num[v[i][j]] != v[i].size() - 1)
						suc = 0;
				}

		if(suc == 0) cout << "No" << endl;
		else {
			for(int i=1;i<=n;i++)
				if(visit[i]) ans[i] = 2;

			cout << "Yes" << endl;
			for(int i=1;i<=n;i++)
				if(ans[i] == 0) cout << 'a';
				else if(ans[i] == 1) cout << 'c';
				else cout << 'b';

			cout << endl;
		}

	}

	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define N 510
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,h[N],num=0,col[N];
bool mp[N][N];
struct edge{
    int to,next;
}data[N*N];
inline void add(int x,int y){
    data[++num].to=y;data[num].next=h[x];h[x]=num;
    data[++num].to=x;data[num].next=h[y];h[y]=num;
}
bool dfs(int x){
    for(int i=h[x];i;i=data[i].next){
        int y=data[i].to;if(col[y]==col[x]) return 0;
        if(col[y]!=-1) continue;col[y]=col[x]^1;
        if(!dfs(y)) return 0;
    }return 1;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();
    while(m--){
        int x=read(),y=read();mp[x][y]=mp[y][x]=1;
    }
    for(int i=1;i<=n;++i)
        for(int j=i+1;j<=n;++j)
            if(!mp[i][j]) add(i,j);
    memset(col,-1,sizeof(col));
    for(int i=1;i<=n;++i) if(col[i]==-1){
        if(!h[i]) continue;//和所有边联通，标记b
        col[i]=0;if(!dfs(i)){puts("No");return 0;}
    }
    for(int i=1;i<=n;++i)
        for(int j=i+1;j<=n;++j)
            if(mp[i][j]&&col[i]+col[j]==1){puts("No");return 0;}
    puts("Yes");
    for(int i=1;i<=n;++i){
        if(col[i]==0) putchar('a');
        else if(col[i]==-1) putchar('b');
        else putchar('c');
    }return 0;
}

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

bool edge[505][505];

int vis[505];
int comp = 1;
int n, m;

void dfs(int u) {
    vis[u] = comp;
    for(int v = 0; v < n; v++) {
        if(edge[u][v] && vis[v] == 0) {
            dfs(v);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        edge[u][v] = true;
        edge[v][u] = true;
    }

    for(int i = 0; i < n; i++) {
        int ej = 0;
        for(int j = 0; j < n; j++) {
            if(edge[i][j] == true) ej++;
        }
        if(ej == n-1) {
            vis[i] = 1;
        }
    }

    for(int i = 0; i < n; i++) {
        if(vis[i]) {
            for(int j = 0; j < n; j++) edge[i][j] = edge[j][i] = 0;
        }
    }

    for(int i = 0; i < n; i++) {
        if(vis[i] == 0) {
            comp++;
            if(comp > 3) {
                cout << "No";
                return 0;
            }
            dfs(i);
        }
    }
    int a = 0, c = 0;
    for(int i = 0; i < n; i++) {
        if(vis[i] == 2) a++;
        if(vis[i] == 3) c++;
    }

    string res(n, '%');
    for(int i = 0; i < n; i++) {
        if(vis[i] == 1) res[i] = 'b';
        if(vis[i] == 2) {
            int cnt = 0;
            for(int j = 0; j < n; j++) cnt += edge[i][j];
            if(cnt != a-1) {
                cout << "No";
                return 0;
            }
            res[i] = 'a';
        }

        if(vis[i] == 3) {
            int cnt = 0;
            for(int j = 0; j < n; j++) cnt += edge[i][j];
            if(cnt != c-1) {
                cout << "No";
                return 0;
            }
            res[i] = 'c';
        }
    }

    cout << "Yes" << endl;
    cout << res << endl;

    return 0;
}

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long double ld;
typedef string str;
#define ll long long int
typedef pair<int,int> pii;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<ld> vd;
typedef vector<str> vs;
typedef vector<pii> vpi;
typedef vector<pl> vpl;

#define rep(i,a,b) for (ll i = (a); i < (b); i++)
#define repd(i,a,b) for (ll i = (b)-1; i >= (a); i--)
#define trav(a,x) for (auto& a : x)

#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound

#define sz(x) (int)x.size()
#define all(x) begin(x), end(x)
#define ins insert
#define pcount(x)  __builtin_popcount(x);

const int mod = 1e9+7;
const ll inf = 1e12;
const ll N= 200001;
unordered_map<ll,list<ll>>mp;
int solve(){
    ll n,m,a,b;cin>>n>>m;
    map<pl,ll>given;
    for(ll i=0;i<m;i++){
        cin>>a>>b;
        given[{a,b}]=1;
        given[{b,a}]=1;
    }

    char ans[n+1];
    for(ll i=0;i<=n;i++){
        ans[i]='1';
    }
    for(ll i=1;i<=n;i++){
        for(ll j=i+1;j<=n;j++){
            if(given.find({i,j})!=given.end()){
                continue;
            }
            else{
                if(ans[i]=='1' && ans[j]=='1'){
                    ans[i]='a';
                    ans[j]='c';
                }
                else if(ans[i]=='1' && ans[j]!='1'){
                    if(ans[j]=='a'){
                        ans[i]='c';
                    }
                    else{
                        ans[i]='a';
                    }
                }
                else if(ans[i]!='1' && ans[j]=='1'){
                    if(ans[i]=='a'){
                        ans[j]='c';
                    }
                    else{
                        ans[j]='a';
                    }
                }
                else if(ans[i]!='1' && ans[j]!='1'){
                    if(ans[i]==ans[j]){
                        cout<<"No";
                        return 0;
                    }
                }
            }

        }
    }
    for(auto j:given){
        a=j.f.f;
        b=j.f.s;
        if((ans[a]=='a' && ans[b]=='c') || (ans[a]=='c' && ans[b]=='a')){
            cout<<"No";
            return 0;
        }
    }
    cout<<"Yes"<<'\n';
    for(ll i=1;i<=n;i++){
        if(ans[i]=='1'){
            cout<<'b';
        }
        else{
            cout<<ans[i];
        }
    }
    return 0;
}
int main(){
    int t;
    t=1;
    while(t){
        solve();
        t--;
    }
    return 0;
}

#include <bits/stdc++.h>

using namespace std;
int vis[555],n,m,hi,num;
vector<int> adj[555],A,C;
bool ok=1,used[555][555];
void dfs(int i,int c)
{
    if(vis[i]&&vis[i]!=c)
    {
        ok=0;
        return;
    }
    if(vis[i]==c)
        return;
    vis[i]=c;
    if(c==1)
        A.push_back(i);
    else
        C.push_back(i);
    for(int j=0;j<adj[i].size();j++)
        dfs(adj[i][j],3-c);
}
int main()
{
    ios::sync_with_stdio(0);
    cin>>n>>m;
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        used[x][y]=1;
        used[y][x]=1;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(!used[i][j])
            {
                hi=i;
                adj[i].push_back(j);
                adj[j].push_back(i);
                num++;
            }
        }
    }
    if(!hi)
    {
        cout<<"Yes\n";
        for(int i=1;i<=n;i++)
            cout<<"b";
    }
    else
    {
        dfs(hi,1);
        if(!ok||num!=(A.size()*C.size()))
            cout<<"No";
        else
        {
            cout<<"Yes\n";
            for(int i=1;i<=n;i++)
            {
                if(vis[i]==1)
                    cout<<"a";
                else if(vis[i]==2)
                    cout<<"c";
                else
                    cout<<"b";
            }
        }
    }
    return 0;
}

#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <set>
#include <cstring>
#include <map>
#include <bitset>
#include <random>
#include <stack>
#include <list>
#include <ctime>

using namespace std;

#define ll long long
#define sc second
#define fs first
#define mp make_pair

const int N = 1e5 + 10;
template<class T> T sqr(T x) { return x*x; }

vector<int> g[1000];
int n, m;
int ans[1000];

int main()
{
	cin >> n >> m;
	for (int i = 0; i < m; i++){
		int u, v;
		cin >> u >> v;
		g[v].push_back(u);
		g[u].push_back(v);
	}
	memset(ans, -1, sizeof(ans));
	for (int i = 1; i <= n; i++){
		if (g[i].size() == n - 1) ans[i] = 1;
	}
	bool ok = 1;
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] != -1) continue;
		ans[i] = 0;
		for (int j = 0; j < g[i].size(); j++)
		{
			int to = g[i][j];
			if (ans[to] != -1)
				continue;
			ans[to] = 0;
		}
		break;
	}
	for (int i = 1; i <= n; i++)
	{
		if (ans[i] == -1) ans[i] = 2;
	}
	for (int i = 1; i <= n; i++){
		for (int j = i+1; j <= n; j++)
		{
			bool is = 0;
			for (int k = 0; k < g[i].size(); k++)
				is |= g[i][k] == j;
			if (!is)
				ok &= (abs(ans[i] - ans[j]) == 2);
			else
				ok &= (abs(ans[i] - ans[j]) < 2);
		}
	}
	if (!ok){
		cout << "No";
		return 0;
	}
	cout << "Yes" << endl;
	for (int i = 1; i <= n; i++)
		cout << char('a' + ans[i]);
	return 0;
}

#include <iostream>
#include <algorithm>
#include <cstring>
#define IOS ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)

using namespace std;

typedef pair<int, int> pii;

int main () {
    IOS;
    int n, m;
    cin >> n >> m;
    bool G[n][n];
    memset(G, false, sizeof(G));
    pii V[n];
    for (int i = 0; i < n; i++) V[i] = pii(n, i);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        u--; v--;
        G[u][v] = G[v][u] = true;
        V[u].first--;
        V[v].first--;
    }
    sort(V, V+n);
    char ans[n];
    memset(ans, '*', sizeof(ans));
    for (int i = 0; i < n; i++) {
        int x = V[i].second;
        if (V[i].first == 1) ans[x] = 'b';
        if (ans[x] != '*') continue;
        ans[x] = 'a';
        for (int j = 0; j < n; j++) {
            if (x == j) continue;
            if (!G[x][j]) {
                if (ans[j] == 'a' || ans[j] == 'b') {
                    cout << "No" << endl;
                    return 0;
                }
                ans[j] = 'c';
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j) continue;
            if (ans[i] == 'a' && ans[j] == 'c' || ans[j] == 'a' && ans[i] == 'c') {
                if (G[i][j]) {
                    cout << "No" << endl;
                    return 0;
                }
            } else {
                if (!G[i][j]) {
                    cout << "No" << endl;
                    return 0;
                }
            }
        }
    }
    cout << "Yes" << endl;
    for (int i = 0; i < n; i++) cout << ans[i];
    cout << endl;
    return 0;
}

#include <iostream>
#include <vector>
using namespace std;
int main()
{
  int n;int m;
  cin>>n>>m;
  int countb = 0;
  int A[n];
  for(int i = 0 ;i < n ;i++)
  {
    A[i] = -1;
  }
  std::vector< vector <int> > v(n);
  int u; int vi;
  for(int i =0 ;i<m ;i++)
  {
    cin>>u>>vi;
    v[u-1].push_back(vi);
    v[vi-1].push_back(u);
    if (v[u-1].size() == n-1)
    {
      A[u-1] = 0;
      countb++;
    }
    if (v[vi-1].size() == n-1)
    {
      A[vi-1] = 0;
      countb++;
    }
  }
  vector <int> :: iterator i ;
  int sizea = 0;
  int sizeb = 0;
  for(int j =0; j < n ; j++)
  {
    if (A[j]==-1)
    {
      A[j] = 1;
      sizea =  v[j].size();
      i = v[j].begin();
      while(i!=v[j].end())
      {
        if(A[(*i)-1]==-1){
          if(v[(*i)-1].size()!=(sizea))
          {
            cout<<"No";return 0;
          }

        A[(*i)-1] = 1;
      }
        i++;
      }
      sizea++;
      break;
    }
  }
  for(int j =0; j < n ; j++)
  {
    if (A[j]==-1)
    {
      A[j]=2;
      sizeb = v[j].size();
      i = v[j].begin();
      while(i!=v[j].end())
      {
        if(A[(*i)-1] == -1)
        {
          if(v[(*i)-1].size()!=(sizeb))
          {
            cout<<"No";return 0;
          }

        A[(*i)-1] = 2;
      }
        i++;
      }
      sizeb++;

      break;
    }
  }
  if (sizea+sizeb-countb != n&&(sizea!=0&&sizeb!=0))
  {
    std::cout << "No";
    return 0;
  }
  for(int j =0; j < n ; j++)
  {
    if (A[j]==-1)
    {
      cout<<"No";return 0;
    }
  }
std::cout << "Yes" << std::endl;
  for(int i =0; i < n ; i++)
  {
    if (A[i]==2)
    {
      cout<<"c";
  }
  if (A[i]==0)
  {
    cout<<"b";
}
if (A[i]==1)
{
  cout<<"a";
}

}
}

/*header*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#define rep(i , x, p) for(int i = x;i <= p;++ i)
#define sep(i , x, p) for(int i = x;i >= p;-- i)
#define gc getchar()
#define pc putchar
#define ll long long
#define mk make_pair
#define fi first
#define se second
using std::min;
using std::max;
using std::swap;
const int maxN = 500 + 7;

inline int gi() {
    int x = 0,f = 1;char c = gc;
    while(c < '0' || c > '9') {if(c == '-')f = -1;c = gc;}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = gc;}return x * f;
}

void print(int x) {
    if(x < 0) pc('-') , x = -x;
    if(x >= 10) print(x / 10);
    pc(x % 10 + '0');
}

int n , m , dis[maxN][maxN], col[maxN];
bool flag;

void dfs(int now , int cl) {
    col[now] = cl;
    rep(i , 1, n) {
        int v = i;
        if(!dis[now][v]) continue;
        if(col[v] == col[now]) {
            puts("No");
            exit(0);
        }
        if(!col[v]) dfs(v , 3 - cl);
    }
}

int main() {
    n = gi();m = gi();
    rep(i , 1, n) rep(j , 1, n) dis[i][j] = 1;
    rep(i , 1, n) dis[i][i] = 0;
    while(m --) {
        int u = gi() , v = gi();
        dis[v][u] = dis[u][v] = 0;
    }
    int B = 0;bool fl = false;
    for(int i = 1;i <= n;++ i) {
        B = i;
        for(int j = 1;j <= n;++ j)
            if(dis[i][j]) fl = true;
        if(fl) break;
    }
    if(fl) dfs(B , 1);
    rep(i , 1, n) {
  		rep(j , 1, i - 1) {
  			if(!dis[i][j]) {
  				if(col[i] + col[j] == 3) {
  					puts("No");return 0;
					}
				}
			}
		}
		rep(i , 1, n) {
			if(col[i] == 0) {
				rep(j , 1, n) {
					if(dis[i][j]) {
						puts("No");return 0;
					}
				}
			}
		}
    puts("Yes");
    for(int i = 1;i <= n;++ i) {
        if(col[i] == 0) pc('b');
        if(col[i] == 1) pc('a');
        if(col[i] == 2) pc('c');
    }
    return 0;
}

#include <bits/stdc++.h>

using namespace std;

vector <set<int>> vec(550);
int cnt;
string str;
bool vis[550];
bool flag ;

void deepika(int u , char ch)
{
    str[u] = ch;
    int i , v , l = vec[u].size();
    for(auto itr = vec[u].begin() ; itr != vec[u].end() ; itr++)
    {
        v = *itr;
        if(str[v] == 'x')
        {
            deepika(v,ch);
        }
    }
}

int main()
{
    int n , m , i , j , u , v;
    scanf("%d %d",&n,&m);

    for( i = 0 ; i <= n ; i++)
    {
        str.push_back('x');
    }

    for( i = 0 ; i < m ; i++)
    {
        scanf("%d %d",&u,&v);
        vec[u].insert(v);
        vec[v].insert(u);
    }
    for( i = 1 ; i <= n ; i++)
    {
        if(vec[i].size() == n-1)
        {
            str[i] = 'b';
        }
    }
    for( i = 1 ; i <= n ; i++)
    {
        if(str[i] == 'x')
        {
            deepika(i,'a');
            break;
        }
    }
    for( i = 1 ; i <= n ; i++)
    {
        if(str[i] == 'x')
        {
            str[i] = 'c';
        }
    }
    //cout << str << endl;
    memset(vis,false,sizeof(vis));
    flag = true;

    for( i = 1 ; i <= n ; i++)
    {
        if(str[i] == 'b')
        {
            continue;
        }
        for( j = i+1 ; j <= n ; j++)
        {
            if(str[i] == str[j])
            {
                if(vec[i].count(j) == 0)
                {
                    flag = false;
                    break;
                }
            }
        }
        if(flag == false)
        {
            break;
        }
    }

    if(flag)
    {
        printf("Yes\n");
        str.erase(str.begin());
        cout << str << endl;
    }
    else
    {
        printf("No\n");
    }
    return 0;
}

#pragma comment(linker, "/stack:200000000")

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")

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

#define uint unsigned int
#define int long long
#define ull unsigned long long
#define ld long double
#define rep(i, l, r) for (int i = l; i < r; i++)
#define repb(i, r, l) for (int i = r; i > l; i--)
#define sz(a) (int)a.size()
#define fi first
#define se second
#define mp(a, b) make_pair(a, b)
#define ret(a) return cout<<a,0;
using namespace std;
const int N=600;
int a[N],n,m,sum,b[N];
//abcabcabc
//cnt(a)+cnt(b)-1+cnt(b)
vector< int > v[N];
vector<int>in['d'];
int u1,u2;
char ch[600];
bool was[N];
map <int ,bool> ma[N];

main(){
	ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
	cin>>n>>m;
	rep(i,0,m){
		cin>>u1>>u2;
		v[u2].push_back(u1);
		v[u1].push_back(u2);
		ma[u1][u2]=true;
		ma[u2][u1]=true;
	}
	rep(i,1,n+1){
		if(sz(v[i])==n-1)
			ch[i]='b',was[i]=1;
	}
	rep(i,1,n+1){
		if(!was[i]){
			ch[i]='a';
			was[i]=true;
			rep(j,0,sz(v[i])){
				if(!was[v[i][j]])
					ch[v[i][j]]='a';
				was[v[i][j]]=1;
			}
			break;
		}
	}
	rep(i,1,n+1){
		if(!was[i]){
			ch[i]='c';
			was[i]=1;
			rep(j,0,sz(v[i])){
				if(!was[v[i][j]])
					ch[v[i][j]]='c';
				was[v[i][j]]=1;
			}
			break;
		}
	}
	rep(i,1,n+1)
		if(!was[i])
			ret("No");
	int t=-1,tt=-1;
	rep(i,1,n+1){
		in[ch[i]].push_back(i);
	}
	rep(i,1,n+1){
		if(ch[i]=='a'&&t==-1){
			t=sz(v[i]);
		}
		if(t!=sz(v[i])&&ch[i]=='a')
			ret("No");

		if(ch[i]=='c'&&tt==-1){
			tt=sz(v[i]);
		}
		if(tt!=sz(v[i])&&ch[i]=='c')
			ret("No");
	}
	rep(i,0,sz(in['a'])){
		rep(j,0,i){
			if(!ma[in['a'][i]][in['a'][j]])
				ret("No");
		}
	}
	rep(i,0,sz(in['c'])){
		rep(j,0,i){
			if(!ma[in['c'][i]][in['c'][j]])
				ret("No");
		}
	}
	cout<<"Yes\n";
	rep(i,1,n+1)
		cout<<ch[i];

}

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <queue>
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <set>

#define pb push_back
#define IN insert
#define ER erase
#define SZ size
#define emp empty
using namespace std;

vector<int> a[600];
map<char,int> cnt;
char s[600];
int n,m;
bool flag=1;

void dfs(int k)
{
    map<int,int> tmap;
    tmap.clear();
    for (int j=0;j<a[k].size();j++)
        tmap[a[k][j]]=1;
    for (int i=1;i<=n;i++)
    {
        if (i!=k&&!tmap[i]&&s[i]!=0&&abs(s[i]-s[k])<=1)
        {
            flag=0;return;
        }
        if (i!=k&&tmap[i]&&s[i]!=0&&abs(s[i]-s[k])>1)
        {
            flag=0;return;
        }
        if (i!=k&&!tmap[i]&&s[i]==0)
        {
            if (s[k]=='a')
                s[i]='c';
            else
                s[i]='a';
            dfs(i);
        }
        if (i!=k&&tmap[i]&&s[i]==0)
        {
            s[i]=s[k];
            dfs(i);
        }
    }
}

void out()
{
    flag=1;
    printf("Yes\n");
    for (int i=1;i<=n;i++)
        printf("%c",s[i]);
    cout<<endl;
    return;
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=0;i<m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x].pb(y);
        a[y].pb(x);
    }
    for (int i=1;i<=n;i++)
    {
        sort(a[i].begin(),a[i].end());
        if (a[i].size()==n-1)
            s[i]='b';
    }
    for (int i=1;i<=n;i++)
    {
        if(s[i]==0)
        {
            s[i]='a';
            dfs(i);
        }
    }
    if (!flag)
        printf("No\n");
    else
        out();
    return 0;
}

#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;
typedef long long li;
const li MAX = 501;
li n, m, inf = 10000000099999, used[MAX], ans[MAX], cnt1 = 0, cnt2 = 0, cnt3 = 0;
vector<li> gr[MAX];
bool ok = 1;
void dfs(li vert) {
	used[vert] = 1;
	if (ans[vert] == 1 && gr[vert].size() != cnt1 + cnt2 - 1) ok = 0;
	else if (ans[vert] == 3 && gr[vert].size() != cnt3 + cnt2 - 1) ok = 0;
	for (auto i : gr[vert]) {
		if (abs(ans[i] - ans[vert]) == 2) {
			ok = 0;
			return;
		}
	}
	for (auto i : gr[vert]) {
		if (!used[i]) dfs(i);
	}
}
int main() {
	ios::sync_with_stdio();
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		li a, b;
		cin >> a >> b;
		gr[a].push_back(b);
		gr[b].push_back(a);
	}
	for (int i = 1; i <= n; i++) {
		if (gr[i].size() != n - 1) {
			ans[i] = 1;
			for (int j = 0; j < gr[i].size(); j++) {
				if (gr[gr[i][j]].size() != n - 1) ans[gr[i][j]] = 1;
			}
			break;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (!ans[i]) {
			if (gr[i].size() == n - 1) ans[i] = 2;
			else ans[i] = 3;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 1) cnt1++;
		else if (ans[i] == 2) cnt2++;
		else cnt3++;
	}
	for (int i = 1; i <= n; i++) {
		if (!used[i]) dfs(i);
	}
	if (ok) {
		cout << "Yes" << "\n";
		for (int i = 1; i <= n; i++) {
			if (ans[i] == 1) cout << "a";
			else if (ans[i] == 2) cout << "b";
			else cout << "c";
		}
	}
	else cout << "No";
//	system("pause");
	return 0;

}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
char s[510];
vector<int> vv[510];
bool flag;
void dfs(int k,char c)
{
    int i;
    if (!flag) return ;
    if (s[k]+c==196)
    {
        flag=false;
        return ;
    }
    s[k]=c;
    for(i=0;i<vv[k].size();i++)
        dfs(vv[k][i],196-c);
}
int main()
{
    int n,m,u,v,i,j,k;
    bool f[510][510],g;
    memset(f,false,sizeof(f));
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        f[u][v]=f[v][u]=true;
    }
    for(i=1;i<=n;i++) s[i]='b';
    g=true;flag=true;
    for(i=1;i<=n-1;i++)
        for(j=i+1;j<=n;j++)
            if (!f[i][j])
            {
                if (g) {k=i;g=false;}
                vv[i].push_back(j);
            }
    if (!g) dfs(k,97);
    if (flag)
    {
        cout<<"Yes"<<endl;
        for(i=1;i<=n;i++)
            putchar(s[i]);
        cout<<endl;
    }
    else cout<<"No"<<endl;
    return 0;
}

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 505;

int n, m;
int g[N][N];
int col[N];

int cnt;

bool dfs(int u, int c) {
    if (col[u] != -1) return col[u] == c;
    col[u] = c;
    cnt++;
    for (int i = 1; i <= n; i++) {
        if (i == u) continue;
        if (g[u][i]) {
            if (!dfs(i, !c)) return false;
        }
    }
    return true;
}

bool judge() {
    int tot = 0;
    memset(col, -1, sizeof(col));
    for (int i = 1; i <= n; i++) {
        if (col[i] == -1) {
            cnt = 0;
            if (dfs(i, 0) == 0) return false;
            if (cnt > 1) tot++;
        }
    }
    //printf("%d\n", tot);
    return tot <= 1;
}

int main() {
    scanf("%d%d", &n, &m);
    int u, v;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            g[i][j] = 1;
    }
    while (m--) {
        scanf("%d%d", &u, &v);
        g[u][v] = g[v][u] = 0;
    }
    if (judge()) {
        printf("Yes\n");
        for (int i = 1; i <= n; i++) {
            if (col[i] == 0) printf("a");
            else printf("c");
        }
        printf("\n");
    } else printf("No\n");
    return 0;
}

/*
ID: SunitSwn
LANG: C++
*/

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

int main() {
    int n,m;
    cin>>n>>m;
    if(m==0){
        if(n>14){
            cout<<"No";
            return 0;
        }
        cout<<"Yes\n";
        for(int i=0 ;i<2*n ; i+=2){
            cout<<(char)(i+97);
        }
        return 0;
    }
    int a[n][n];
    vector<pair<int ,int > > p;
    for(int i=0 ;i<n; i++){
        for(int j = 0; j<n ; j++){
            a[i][j] = 0;
        }
    }

   int st;
    vector< vector<int> > v (n);
    map<pair<int ,int > ,int> mp;
    for(int i=0 ;i<m;i++){
        int x,y;
        cin>>x>>y;
        if(x>y) swap(x,y);
        a[x-1][y-1] = 1;
        p.push_back(make_pair(x-1,y-1));
        mp.insert(make_pair(make_pair(x-1,y-1),0));

    }
    for(int i=0 ;i<n; i++){
        for(int j = i+1; j<n ;j++){
            if(a[i][j] == 0){
                st =i;
                v[i].push_back(j);
                v[j].push_back(i);
            }
        }
    }
    for(int i=0 ;i<n;i++){
        // cout<<"\n "<<i<<" : ";
    for(int j=0 ;j<v[i].size(); j++){
        //  cout<< v[i][j]<<" ";
        }
    }
    queue<int> q;
    int mark[n] = {0};
    int ans[n] = {0};
    q.push(st);
    ans[st] = 'a';
    while(!q.empty()){
        int x = q.front();
        q.pop();
        mark[x] =1;
        for(int j =0 ;j<v[x].size(); j++){
            if(mark[v[x][j]] == 0){
                q.push(v[x][j]);
                mark[v[x][j]] = 1;
                ans[v[x][j]] = ans[x]==97?99:97;
            }
        }
    }
    for(int i=0 ; i<n ;i++){
        if(ans[i]==0) ans[i] = 98;
    }

    for(int i=0 ;i<m; i++){
       int f = p[i].first;
       int s = p[i].second;
       if(abs(ans[f] - ans[s])>=2){
           cout<<"No";
           return 0;
       }
    }

    for(int i=0 ; i<n ; i++){
        for(int j=i+1 ;j<n ;j++){
            if(abs(ans[i] - ans[j])<2){
                map <pair<int ,int> ,int> ::iterator it ;
                if(mp.find(make_pair(i,j)) == mp.end()){
                    cout<<"No";
                    return 0;
                }
            }
        }
    }
    cout<<"Yes\n";
    for(int i=0 ; i<n ;i++){
        cout<<(char)ans[i];
    }
	return 0;
}

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
using namespace std;

vector<int> link[505];

int main()
{
	int n, m, n1, n2, fillcnt = 0;
	char ans[505] = { 0 };
	bool is_ans = true;

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

	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		cin >> n1 >> n2;
		link[n1].push_back(n2);
		link[n2].push_back(n1);
	}

	for (int i = 1; i <= n; i++) {
		if (link[i].size() == n - 1) {
			ans[i] = 'b';
		}

		if (ans[i] == '\0' && fillcnt < 2) {
			for (int j = 0; j < link[i].size(); j++) {
				ans[link[i][j]] = (fillcnt == 0 ? 'a' : 'c');
			}
			ans[i] = (fillcnt == 0 ? 'a' : 'c');
			fillcnt++;
		}
		else if (ans[i] == '\0' && fillcnt == 2) {
			is_ans = false;
			break;
		}
	}

	if (is_ans) {
		cout << "Yes" << endl << ans << endl;
	}
	else {
		cout << "No" << endl;
	}
	return 0;
}

#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define mp make_pair
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
//#define mod (((ll)1000000000) * ((ll)1000000000))
using namespace std;

typedef    long long int ll;
typedef unsigned long long int ull;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;
typedef pair < int , int > ii;
const ll mod=1e9+7;
const ll mod2=1e9+9;
const ll maxn = 1e3+5;
const int root=1e7+5;
const long long inf = 1e18 + 18;
double pie4=3.1415926535;
//dont do silly mistake as always-
//1-read question properly(dont miss single line)
//2-check maximum array size
//3-int or long long int or ull or sort(a+1,a+n+1)-indexing
//4-do u understand question correctly(shampoo)?
//5-MOST IMP-BE CALM YOU CAN DO:)
//6-think edge case or corner case before submitting.
bool flag = true ;
vector<ll>a[maxn] ;
ll visit[maxn],c[maxn],dp[505][505] ;

void dfs(ll s){

	visit[s] = 1 ;

	for(auto it:a[s]){

		if(!visit[it]){

			c[it] = 1 xor c[s] ;
			dfs(it);
		}

		else{

			if(c[it]==c[s])
			flag = false ;
		}
	}
}

int main(){

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

	ll n,m,i,u,v ,j;

	cin >> n >> m;

	if(n==1){

		cout<<"Yes"<<endl;
		cout<<"a"<<endl;
		return 0 ;
	}

	if(n==2 && m==0){

		cout<<"Yes"<<endl;
		cout<<"ac"<<endl;
		return 0 ;
	}

	for(i=0;i<m;i++){

		cin >> u >> v ;

		dp[u][v] = 1 ;
		dp[v][u] = 1 ;
	}

	for(i=1;i<=n;i++){

		for(j=1;j<=n;j++){

			if(i==j)
			continue ;

			if(dp[i][j]==0)
			a[i].eb(j);
		}
	}

	for(i=1;i<=n;i++){

		if(!visit[i]){

			if(siz(a[i])==0)
			c[i] = 2 ;

			else{

				ll idx = 1 ;

			for(j=1;j<=n;j++){

				if(j!=i && visit[j] && dp[i][j]==1){

					if(c[j]==2){

						cout<<"No"<<endl;
						return 0 ;
					}

					idx = c[j];
					break;
				}
			}

			c[i] = idx ;
			dfs(i);

		}

			if(flag==false){

				cout<<"No"<<endl;
				return 0 ;
			}
		}
	}

	for(i=1;i<=n;i++){

		for(j=1;j<=n;j++){

			if(dp[u][v]==1){

				if(c[u]==c[v] || c[u]==2 || c[v]==2)
				continue ;

				else{
					cout<<"No"<<endl;
				    return 0 ;
				}
			}
		}
	}

	cout<<"Yes"<<endl;

	for(i=1;i<=n;i++){

		if(c[i]==1)
		cout<<"a";

		else if(c[i]==0)
		cout<<"c";

		else
		cout<<"b";
	}

}

#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int edge[maxn][maxn];
vector <int> edg[maxn];
queue<int> que;
char ans[maxn];
int pro[maxn];
char con[maxn][4];
int main()
{
	int n,m;
	cin>>n>>m;
	memset(con,1,sizeof(con));
	memset(pro,3,sizeof(pro));
	for(int i=1;i<=m;i++)
	{
		int temp1,temp2;
		cin>>temp1>>temp2;
		edge[temp1][temp2]=edge[temp2][temp1]=1;
	}
	int fin=n;
	while(fin!=0)
	{
		fin--;
//	que.push(1);
//
//	ans[1]='a';
//	pro[1]=1;
    int cur;
    for(cur=1;cur<=n;cur++)
    {
    	if(pro[cur]!=1)
    	{
    		break;
		}
	}
	que.push(cur);
	for(int i=1;i<=3;i++)
	{
		if(con[cur][i]==1)
		{
			ans[cur]='a'+i-1;
			break;
		}
	}
	pro[cur]=1;
	while(que.size())
	{
		int i=que.front();
		que.pop();
		for(int j=1;j<=n;j++)
		{
			if(abs(j-i)==1)
			{
				if(edge[i][j]==0)
				{
					cout<<"No";
					exit(0);
				}
			}
			else
			{
				if(pro[j]==1)
				{
					continue;
				}
				if(edge[i][j]!=0)
				{
					pro[j]=1;
					ans[j]=ans[i];
				}
				else
				{
					pro[j]--;
					con[j][ans[i]-'a'+1]=0;
				}
				if(pro[j]==1)
				{
					que.push(j);fin--;
				}
			}
		}
    }
    }
    cout<<"Yes"<<endl;
    for(int i=1;i<=n;i++)
    {
    	cout<<ans[i];
	}
}

#include<iostream>
#include<vector>
#include<list>

using namespace std;

vector<list<int> > g(501);
int dfs(int u,char v[],char c)
{

	v[u]=c;list<int>::iterator it;
	for(it=g[u].begin();it!=g[u].end();it++)
	{
		if(v[*it]=='b')
		break;
	}
	if(it==g[u].end())
	return 0;
	for(it=g[u].begin();it!=g[u].end();it++)
	{
		if(v[*it]==' ')
		{
			dfs(*it,v,c);
		}
	}
	return 1;
}
int main()
{
    int n,m,a,b,i;
    char v[501];
    for(i=0;i<501;i++)
     v[i]=' ';
     cin>>n>>m;
    for(i=0;i<m;i++)
    {
    	cin>>a>>b;
       	g[a].push_back(b);
       	g[b].push_back(a);
	}
	for(i=1;i<=n;i++)
	{
		if(g[i].size()==n-1)
		 v[i]='b';
	}
	for(i=1;i<=n;i++)
	{
	  if(v[i]==' ')
	  break;
//	dfs(,v);
	}
	if(i<=n)
	{
//	cout<<"dfs fora";
	if(dfs(i,v,'a')==0)
	{
		cout<<"No";return 0;
	}
	//for(i=1;i<=n;i++)
//	cout<<v[i];
}
		for(i=1;i<=n;i++)
	{
	  if(v[i]==' ')
	  break;
//	dfs(,v);
}
if(i<=n)
{
//cout<<"ds b";
	if(dfs(i,v,'c')==0)
	{
		cout<<"No";return 0;
	}
	//	for(i=1;i<=n;i++)
//	cout<<v[i];
}
for(i=1;i<=n;i++)
	{
	  if(v[i]==' ')
	  {
	  		cout<<"No";return 0;
	  }
//	dfs(,v);
	}
cout<<"Yes"<<endl;
for(i=1;i<=n;i++)
cout<<v[i];
}

#include<bits/stdc++.h>

using namespace std;

int adj[600][600],n,m,u,v,i,j;

char ans[600];

int main(){

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

	while(m--) scanf("%d%d",&u,&v),adj[u][v]=adj[v][u]=1;

	for(i=1;i<=n;i++)

		for(j=1;j<=n;j++){

			if(i==j||adj[i][j]) continue;

			if(abs(ans[i]-ans[j])==2){

				puts("No");

				return 0;

			}

			if(!ans[i]&&ans[j]) ans[i]='a'+'c'-ans[j];

			if(ans[i]&&!ans[i]) ans[j]='a'+'c'-ans[i];

			if(!ans[i]&&!ans[j]) ans[i]='a',ans[j]='c';

		}

	for(i=1;i<=n;i++) if(!ans[i]) ans[i]='b';

	for(i=1;i<=n;i++)

		for(j=1;j<=n;j++)

			if(i!=j&&!adj[i][j]&&abs(ans[i]-ans[j])<2){

				puts("No");

				return 0;

			}

	puts("Yes");

	puts(ans+1);

	return 0;

}

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

using namespace std;

#define pb push_back

vector <int> g[510];
char s[510];

int main(){
    int n, m;
    int a, b;
    cin >> n >> m;
    for (int i = 0; i < m; i++){
        cin >> a >> b;
        g[a].pb(b);
        g[b].pb(a);
    }

    for (int i = 1; i <= n; i++)
        if (g[i].size() == n - 1)
            s[i] = 'b';

    for (int i = 1; i <= n; i++){
        if (s[i] != 'b'){
            s[i] = 'a';
            for (int j = 0; j < g[i].size(); j++)
                if (s[g[i][j]] != 'b')
                    s[g[i][j]] = 'a';
            break;
        }
    }
    for (int i = 1; i <= n; i++){
        if (s[i] != 'b' && s[i] != 'a'){
            s[i] = 'c';
        }
    }
    bool f = false;
    for (int i = 1; i <= n; i++){
        if (s[i] == 'c' ){
            for (int j = 1; j <= n; j++)
                if (s[i] == s[j] && i != j || s[j] == 'b'){
                    f  = false;
                    for (int k = 0; k < g[i].size(); k++)
                        if (g[i][k] == j){
                            f = true;
                            break;
                        }
                    if (f == false){
                        cout << "NO";
                        return 0;
                    }
                }
        }
    }
    cout << "YES" << "\n";
    for (int i = 1; i <= n; i++)
            cout << s[i];
}

//Must so
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<ctype.h>
#include<queue>
#include<vector>
#include<set>
#include<cstdio>
#include<cmath>
#define mem(a,x) memset(a,x,sizeof(a))
#define ex(x) ((x)*(x))
#define inf 1<<29
#define NN 503
using namespace std;
const double PI = acos(-1.0);
typedef long long LL;
bool mp[NN][NN];//��¼���Ƿ���ͨ
int n,m;
char s[NN];//ÿ�������ĸ

//�������ĵ������a-c����c-a
void init()
{
    mem(mp,0);
    for (int i = 0,u,v;i < m;i++)
    {
        scanf("%d%d",&u,&v);
        mp[u][v] = 1;
        mp[v][u] = 1;
    }
    for (int i = 0;i <= n;i++)
    {
         mp[i][i] = 1;
         s[i] = 'b';
    }
}

bool fool()
{
    for (int i = 1;i <= n;i++)
    {
        for (int j = 1;j <= n;j++)
        {
            if (mp[i][j] == 0)
            {
                if (s[i] == 'b')
                {
                    if (s[j] == 'b') s[i] = 'a',s[j] = 'c';
                    else if (s[j] == 'a') s[i] = 'c';
                    else if (s[j] == 'c') s[i] = 'a';
                }
                else if (s[i] == 'a')
                {
                    if (s[j] == 'b') s[j] = 'c';
                    else if (s[j] == 'a') return 0;
                }
                else if (s[i] == 'c')
                {
                    if (s[j] == 'b') s[j] = 'a';
                    else if (s[j] == 'c') return 0;
                }
            }
        }
    }
    return 1;
}
int main()
{
    while (cin>>n>>m)
    {
        init();
        if (fool())
        {
            puts("Yes");
            for (int i = 1;i <= n;i++) printf("%c",s[i]);
            puts("");
        }
        else puts("No");
    }
    return 0;
}

#include <bits/stdc++.h>
//#include <ext/hash_map>
//using namespace __gnu_cxx;
typedef long long LL;
typedef unsigned long long ULL;
#define RDI(x) scanf("%d",&x)
#define RDI_2(x,y) scanf("%d%d",&x,&y)
#define RDD(x) scanf("%lf",&x)
#define RDD_2(x,y) scanf("%lf%lf",&x,&y)
#define RDL(x) scanf("%I64d",&x)
#define RDL_2(x,y) scanf("%I64d%I64d",&x,&y)
#define RDS(x) scanf("%s",x)
#define RDS_2(x,y) scanf("%s%s",x,y)
#define PUTI(x) printf("%d",x)
#define PUTL(x) printf("%I64d",x)
#define PUTF(x) printf("%f",x)
#define PUTC(x) putchar(x)
#define LINE putchar('\n')
#define SPACE putchar(' ')
#define REP(i,x) for(int i=0;i<int(x);++i)
#define REP_1(i,x) for(int i=1;i<=int(x);++i)
#define FOR_EDGE(i,x) for(int i=head[x];~i;i=edge[i].next)
#define FOR_EDGE2(x,i,y) for(int i=head[x][y];~i;i=edge[i].next)
#define FOR(i,a,b) for(int i=int(a);i<=int(b);++i)
#define FORD(i,a,b) for(int i=int(a);i>=int(b);--i)
#define DWN(i,x) for(int i=int(x-1);i>=0;--i)
#define DWN_1(i,x) for(int i=int(x);i>0;--i)
#define FIL(x,v) memset(x,v,sizeof(x))
#define CLR(x) memset(x,0,sizeof(x))
#define ALL(x) x.begin(),x.end()
#define p_queue priority_queue
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define x first
#define y second
#define mp(x,y) make_pair(x,y)
#define check(x) printf("%s=%d\n",#x,x)
using namespace std;
template<typename T>
T gcd(T a, T b){ return b == 0 ? a : gcd(b, a%b); }
template<typename T>
T lcm(T a, T b){ return a / gcd(a, b)*b; }
template<typename T>
T ext_gcd(T a, T b, T& x, T& y)
{
    if(b==0){x=1,y=0;return a;}
    T d=ext_gcd(b,a%b,y,x);
    y-=x*(a/b);
    return d;
}
template<typename T>
T inverse(T a, T n)
{
    T x,y;
    T t=ext_gcd(a,n,x,y);
    if(t!=1)return -1;
    return (x%n+n)%n;
}
template<typename T>
T Q_mul(T a,T b,T Mod)
{
    T ret;
    for(ret =0;b;b>>=1,a=(a+a)%Mod)if(b&1)ret=(ret+a)%Mod;
    return ret;
}
template<typename T>
T quick_pow_mod(T a, T b,T Mod)
{
    T ret;
    for(ret=1;b;b>>=1,(a*=a)%=Mod)if(b&1)(ret*=a)%=Mod;
    return ret;
}
template<typename T>
T quick_pow(T a, T b)
{
    T ret;
    for(ret=1;b;b>>=1,a*=a)if(b&1)ret*=a;
    return ret;
}
double combination(int n, int r)
{
    if (r<n - r) return combination(n, n - r);
    double s = 1.0;
    REP_1(i, n - r) s *= (r + i), s /= i;
    return s;
}
template<typename T>
inline void read(T& v)
{
    T ret=0,sgnv=1;
    char p;
    while(!isdigit(p=getchar()))if(p=='-')sgnv=-1;
    do ret=(ret<<3)+(ret<<1)+p-'0';while(isdigit(p=getchar()));
    v=sgnv*ret;
}
//const double eps=1e-8;
//inline int sgn(double x){ return (x>-eps)-(x<eps); }
//const LL mod=1000000007;
//const double INF = 1e9;
//const LL INF = numeric_limits<LL>::max();
//const int INF=0x3f3f3f3f;
//const int INFCELL = 0x7f;
//const int NINFCELL = 0x80;
//const int NINF = 0x80808080;
#define MAX 500+5
pair<int,int> node[MAX];
bool edge[MAX][MAX],vis[MAX];
char s[MAX];
int d[MAX];
int main()
{
    //freopen("test.in","r",stdin);
    int n,m,u,v,k,cur;
    read(n),read(m);
    if(n==1){printf("Yes\na");return 0;}
    if(m==0){n==2?printf("Yes\nac"):printf("No");return 0;}
    REP(i,m)read(u),read(v),edge[u][v]=edge[v][u]=true,++node[u].x,++node[v].x;
    REP_1(i,n)node[i].y=i;
    sort(node+1,node+1+n);
    cur=0,k=1;
    while(k<=n)
    {
        if(cur==3){printf("No");return 0;}
        int r=k;
        bool filled=false;
        while(r<=n&&node[r].x==node[k].x)++r;
        if(cur==2&&node[k].x!=n-1){printf("No");return 0;}
        if(r-k!=node[k].x+1)
        {
            if(r-k!=(node[k].x+1)*2||cur!=0){printf("No");return 0;}
            filled=true,s[node[k].y-1]='a';
            FOR(i,k+1,r-1)s[node[i].y-1]=edge[node[k].y][node[i].y]?'a':'c';
        }
        if(!filled)FOR(i,k,r-1)s[node[i].y-1]=node[i].x==n-1?'b':cur==0?'a':'c';
        k=r,++cur;
    }
    printf("Yes\n%s",s);
    return 0;
}

#include <iostream>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
typedef int node;
//множество ребер
multimap<node, node> E;
void paint_node(int node, char let, string &answer)
{
	//сначало проверим, можно ли так окрасить эту вершину
	auto range = E.equal_range(node);
	for (auto i = range.first; i != range.second; i++)
	{
		if (answer[i->second] == let)
			throw int(1);
	}
	//нет исключений, всё окей
	answer[node] = let;
	return;
}
multimap<node, node> E2;
bool check_answer(const string &answer, const multimap<node, node> &E)
{
	for each (auto var in E)
	{
		if (answer[var.first] == 'a' && answer[var.second] == 'c' ||
			answer[var.first] == 'c' && answer[var.second] == 'a')
		{
			return false;
		}
	}
	return true;
}

int main()
{

	int n, m;
	cin >> n >> m;
	string answer(n, 'b');//дефолтный ответ
	//заполним множество как поностью связный граф
	for (int i = 0; i < n; i++)
		for (int j = i + 1; j < n; j++)
		{
			E.insert(make_pair(i, j));
			E.insert(make_pair(j, i));
		}
	//вычтем из него предложенный
	for (int i = 0; i < m; i++)
	{
		int v1, v2;
		cin >> v1 >> v2;
		v1--;
		v2--;
		E2.insert(make_pair(v1, v2));
		E2.insert(make_pair(v2, v1));
		auto range = E.equal_range(v1);
		for (auto i = range.first; i != range.second; i++)
		{
			if (i->second == v2)
			{
				E.erase(i);
				break;
			}
		}
		range = E.equal_range(v2);
		for (auto i = range.first; i != range.second; i++)
		{
			if (i->second == v1)
			{
				E.erase(i);
				break;
			}
		}
	}
	//auto iter = E.begin();
	//if (E.size() != 0)
	//	answer[iter->first] = 'a';
	//а теперь проверим, можно ли остатки закрасить 2-мя красками
	try
	{
		while (E.size() != 0)
		{
			int node = E.begin()->first;
			if (answer[node] == 'b')
				answer[node] = 'a';
			char let = 'c';
			if (answer[node] == 'c')
				let = 'a';
			auto range = E.equal_range(node);
			for (auto i = range.first; i != range.second; i++)
			{
				paint_node(i->second, let, answer);
			}
			E.erase(node);
		}
	}
	catch(int a)
	{
		cout << "No";
		return 0;
	}
	if (check_answer(answer, E2))
		cout << "No";
	else
		cout << "Yes" << endl << answer;
	return 0;
}

// Problem : A. Graph and String
// Contest : Codeforces - AIM Tech Round (Div. 1)
// URL : https://codeforces.com/problemset/problem/623/A
// Memory Limit : 256 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
#define debug(x) cerr << #x << " = " << x << '\n'
#define debug_arr(a , n) for(int i = 0 ; i < n ; i++)cerr << a[i] << " "
#define speed ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define vi vector<int>
#define vll vector<ll>
#define all(x) (x).begin() , (x).end()
#define inf 1000000000
#define mod 1000000007

const int max_n = 1e5 + 9;

typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indexed_set;
ll power(ll a , ll b)
{
    ll prod = 1;
    while(b)
    {
        if(b&1)
        prod = (prod*a)%mod;
        a = (a*a)%mod;
        b >>= 1;
    }
    return prod;
}
int n , m;
vi a[max_n];
int main()
{
  	cin >> n >> m;
  	for(int i = 0 ; i < m ; i++){
  		int x , y;
  		cin >> x >> y;
  		a[x].pb(y);
  		a[y].pb(x);
  	}

  	map<int , char> m;
  	for(int i = 1 ; i <= n ; i++){
  		set<int> s;
  		for(int j = 1 ; j <= n ; j++){
  			if(i != j)s.insert(j);
  		}

  		for(int it : a[i]){
  			if(s.count(it))s.erase(it);
  		}
  		if(s.empty()){
  			if(m.find(i) == m.end()){
  				m[i] = 'b';
  			}
  		}

  		else{
  			int flag = 0;
  			char c = '?';
  			for(auto it : s){
  				if(m.find(it) != m.end()){
  					if(m[it] == 'b'){
  						debug("1");
  						cout << "No\n";
  						return 0;
  					}
  					else {
  						if(c == '?'){
  							c = m[it];
  							flag = 1;
  						}
  						else{
  							if(c != m[it]){
  								debug("2");
  								cout << "No\n";
  								return 0;
  							}
  						}
  					}
  				}

  				if(flag){
  					if(m.find(i) != m.end() && m[i] == c){
  						debug("3");
  						cout << "No\n";
  						return 0;
  					}

  					m[i] = (c == 'a' ? 'c' : 'a');
  					for(auto it : s){
  						m[it] = c;
  					}
  				}
  				else{
  					if(m.find(i) == m.end() || m[i] == 'a'){
  						m[i] = 'a';
  						for(auto it : s)m[it] = 'c';
  					}
  					else{
  						m[i] = 'c';
  						for(auto it : s)m[it] = 'a';
  					}
  				}
  			}
  		}
  	}

  	vi b[n+1];
  	for(int i = 1 ; i <= n ; i++){
  		for(int j = 1 ; j <= n ; j++){
  			if(i != j && abs(m[i] - m[j]) <= 1)b[i].pb(j);
  		}
  	}

  	for(int i = 1 ; i <= n ; i++){
  		if(a[i] != b[i]){
  			cout << "No\n";
  			return 0;
  		}
  	}
  	cout << "Yes\n";
  	for(int i = 1 ; i <= n ; i++)cout << m[i];
    return 0;
}

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

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>

#define ll long long
// ll mod = 998244353 ;

ll X[] = {1,-1,0,0};
ll Y[] = {0,0,1,-1};

void dfs(vector<ll> adjlist[], ll i,ll v[],char s[],char c)
{
    v[i] = 1;
    s[i] = c;
    for(ll j=0;j<adjlist[i].size();j++)
    {
        ll ng = adjlist[i][j];
        if(!v[ng])
        {
            dfs(adjlist,ng,v,s,c);
        }
    }
    return;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    ll T;
    T=1;
    //cin>>T;
    start:
    while(T--)
    {
        ll n,m;
        cin>>n>>m;
        vector<ll> adjlist[n];
        for(ll i=0;i<m;i++)
        {
            ll x,y;
            cin>>x>>y;
            x--;y--;
            adjlist[x].push_back(y);
            adjlist[y].push_back(x);
        }
        ll v[n] = {0};

        char s[n];

        vector<pair<ll,ll> > vec;

        for(ll i=0;i<n;i++)
        {
            if(!v[i])
            {
                ll c = 0;
                v[i] = 1;
                for(ll j=0;j<adjlist[i].size();j++)
                {
                    ll ng = adjlist[i][j];
                    if(!v[ng])
                    {
                        c++;
                        if(c==3){cout<<"NO"<<endl;goto start;}
                        if(c==1){dfs(adjlist,ng,v,s,'a');}
                        if(c==2){dfs(adjlist,ng,v,s,'c');}
                    }
                }
                vec.push_back({i,c});
            }

        }
        for(ll i=0;i<n;i++){v[i]=false;}
        if(vec.size()>3)
        {
            cout<<"NO"<<endl;goto start;
        }
        if(vec.size()==3)
        {
            if(vec[0].second==2||vec[1].second==2||vec[2].second==2)
            {
                cout<<"NO"<<endl;goto start;
            }
            ll c = 0;
            for(ll i=0;i<n;i++)
            {
                if(!v[i])
                {
                    v[i] = 1;
                    s[i] = 'a'+c;
                    c++;
                    for(ll j=0;j<adjlist[i].size();j++)
                    {
                        ll ng = adjlist[i][j];
                        if(!v[ng])
                        {
                            dfs(adjlist,ng,v,s,s[i]);
                        }
                    }
                }

            }

        }

        else if(vec.size()==2)
        {
            if(vec[0].second==2||vec[1].second==2)
            {
                cout<<"NO"<<endl;goto start;
            }
            ll c = 0;
            for(ll i=0;i<n;i++)
            {
                if(!v[i])
                {
                    v[i] = 1;
                    s[i] = 'a'+c;
                    c++;
                    for(ll j=0;j<adjlist[i].size();j++)
                    {
                        ll ng = adjlist[i][j];
                        if(!v[ng])
                        {
                            dfs(adjlist,ng,v,s,s[i]);
                        }
                    }
                }

            }
        }

        else if(vec.size()==1)
        {
            if(vec[0].second==2)
            {
                for(ll i=0;i<n;i++)
                {
                    if(!v[i])
                    {
                        v[i] = 1;
                        s[i] = 'b';
                        ll c = 0;
                        for(ll j=0;j<adjlist[i].size();j++)
                        {
                            ll ng = adjlist[i][j];
                            if(!v[ng])
                            {
                                c++;
                                if(c==3){cout<<"NO"<<endl;goto start;}
                                if(c==1){dfs(adjlist,ng,v,s,'a');}
                                if(c==2){dfs(adjlist,ng,v,s,'c');}
                            }
                        }
                    }

                }
            }
            else
            {
                ll c = 0;
                for(ll i=0;i<n;i++)
                {
                    if(!v[i])
                    {
                        v[i] = 1;
                        s[i] = 'a'+c;
                        c++;
                        for(ll j=0;j<adjlist[i].size();j++)
                        {
                            ll ng = adjlist[i][j];
                            if(!v[ng])
                            {
                                dfs(adjlist,ng,v,s,s[i]);
                            }
                        }
                    }

                }
            }
        }

        cout<<"YES"<<endl;
        for(ll i=0;i<n;i++)
        {
            cout<<s[i];
        }cout<<endl;

    }
    return 0;
}

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair

int used[1111] = {0};
int color = 0;
int n,m;
int kol[1111] = {0};
vector <char> ans;
int g[1111][1111] = {0};

vector<vector <int> > v;

int dfs(int x) {
    used[x] = color;
    for (int i = 0; i < v[x].size(); i++) {
        if (used[v[x][i]] != 0 && used[v[x][i]] != color && used[v[x][i]] != 3) {
            cout << "No";
            exit(0);
        }
        if (used[v[x][i]] == 0) dfs(v[x][i]);
    }
}

bool foo(int x, int y) {
    if (x + y == 3) return false;
    return true;
}

bool check() {
    for (int i = 0; i < n; i++) {
        for(int j = i+1; j < n; j++) {
            if (foo(used[i], used[j]) && g[i][j] == 0) return false;
        }
    }
    return true;
}

int main() {
    cin >> n >> m;
    v.resize(n);
    for (int i = 0; i < m; i++) {
            int q,w;
        cin >> q >> w; q--; w--;
        v[q].pb(w);
        v[w].pb(q);
        kol[q]++;
        kol[w]++;
        g[q][w] = 1;
    }
    ans.resize(n);
    for (int i = 0; i < n; i++) {
        if (kol[i] == n-1) {
            used[i] = 3;
        }
    }
    color = 0;
    for (int i = 0; i < n; i++) {
        if (used[i] == 0) {
            if (color == 2) {
                cout << "No";
                exit(0);
            }
            color++;
            dfs(i);
        }
    }
    if (check()) {
        cout << "Yes\n";
        for (int i = 0;i < n; i++) {
            if (used[i] == 3) cout << "b";
            if (used[i] == 2) cout << "c";
            if (used[i] == 1) cout << "a";
        }
    } else {
        cout << "No";
    }
}

#include<iostream>
#include<stack>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<ctime>
#include<math.h>
#include<functional>
#include<cstring>
#include<iomanip>
#include<set>
#include<utility>
#include<limits.h>
#include<stdio.h>
#define lowbit(x) (x)&(-x)

typedef long long ll;
//
using namespace std;
const int maxn = 500 + 10;
const int maxm = 1e6 + 10;
const ll mod = 998244353;
const int inf = 0x3ffffff;
const double eps = 1e-5;
/*ll gcd(ll a, ll b)//���Լ��
{
	return b == 0 ? a : gcd(b, a%b);
}
ll lcm(ll a, ll b)
{
	return a / gcd(a, b)*b;
}
/l fast_pow(ll a, ll k)//������
{
	ll ans = 1;
	a = a%mod;
	while (k != 0)
	{
		if (k & 1) ans = (ans*a) % mod;
		k >>= 1;
		a = (a*a) % mod;
	}
	return ans;
}
ll C(ll n, ll m)//������ļ���
{
ll ans = 1;
for (int i = 1;i <= m;i++)
ans = (ans*(n - m + i) / i) % mod;
return ans%mod;
}

bool is_prime(ll x)//�����ж�
{
if (x == 2 || x == 3) return true;
if (x % 6 != 1 && x % 6 != 5) return false;
ll temp = sqrt(1.0*x);
for (ll i = 5;i <= temp;i += 6)
if (x%i == 0 || x % (i + 2) == 0) return false;
return true;
}
int prime[maxm], pnum = 0;//������pnum������
bool p[maxm] = { 0 };//�����ɸ������Ϊtrue
void Find_Prime()//�����ɸѡ��������һ���������Ͱ����ı���ȫ��ɸ��
{
for (int i = 2;i < maxm;i++)
{
if (p[i] == false)//����һ����һ�������ж�������
{
prime[pnum++] = i;
for (int j = i + i;j < maxm;j += i)//ɸ�������ı���
p[j] = true;
}
}
}

/*void Exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) x = 1, y = 0;
else Exgcd(b, a % b, y, x), y -= a / b * x;
}//x��a��mod b�µ���Ԫ
ll CRT(int a[],int m[],int n)
{
ll M=1,ans=0,t,x,y;
for(int i=0; i<n; i++)
{
M*=m[i];///MΪ�����˻�
}
for(int i=0; i<n; i++)
{
t=M/m[i];///����mi�����n-1�������˻�
Exgcd(t,m[i],x,y);///����Ԫ������չŷ�����ת����t*ti+m[i]*y=1����ti
ans=(ans+a[i]*x*t)%M;
}
return (ans+M)%M;
}*/

char s[maxn];
int n, m, G[maxn][maxn];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> m;
	int u, v;
	for (int i = 0;i < m;i++)
	{
		cin >> u >> v;
		G[u][v] = 1;
		G[v][u] = 1;
	}
	fill(s + 1, s + 1 + n, 'z');
	for (int i = 1;i <= n;i++)
	{
		for (int j = i+1;j <= n;j++)
		{
			if (G[i][j] == 0)
			{
				if (s[i] == 'z')
				{
					if (s[j] == 'a') s[i] = 'c';
					else if (s[j] == 'c') s[i] == 'a';
					else
					{
						s[i] = 'a';
						s[j] = 'c';
					}
				}
				else if (s[j] == 'z')
				{
					if (s[i] == 'a') s[j] = 'c';
					else if (s[i] == 'c') s[j] == 'a';
					else
					{
						s[i] = 'a';
						s[j] = 'c';
					}
				}
			}
		}
	}
	for (int i = 1;i <= n;i++)
		if (s[i] == 'z') s[i] = 'b';
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= n;j++)
		{
			if (i != j&&s[i] == s[j] || s[i] == s[j] - 1 || s[i] == s[j] + 1)
			{
				if (G[i][j] == 0) return cout << "No", 0;
			}
		}
	}
	s[n + 1] = '\0';
	cout << "Yes" << endl << s + 1;
	return ~~(0 - 0);
}

/* Author haleyk10198 */
/* �@��:  haleyk10198 */
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <map>
#include <queue>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <string>
#include <set>
#include <stack>

#define MOD 1000000007
#define LINF (1LL<<60)
#define INF 2147483647
#define PI 3.1415926535897932384626433
#define ll long long
#define pii pair<int,int>
#define mp(x,y) make_pair((x),(y))

using namespace std;
set<int> near[510];
string out;
bool f;

int main(){
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	ios_base::sync_with_stdio(false);
	int n,m;
	cin>>n>>m;
	out=string(n,' ');
	for(int i=0;i<n;i++)
		for(int j=i+1;j<n;j++)
				near[i].insert(j);
	for(int i=0;i<m;i++){
		int u,v;
		cin>>u>>v;
		if(u>v)
			swap(u,v);
		near[--u].erase(--v);
	}
	for(int i=0;i<n;i++){
		if(near[i].empty()&&out[i]==' ')
			out[i]='b';
		else{
			if(out[i]==' ')
				out[i]='a';
			for(int x:near[i]){
				if(out[x]!=' '){
					if(out[x]==out[i])
						f=true;
				}
				else if(out[i]=='a')
					out[x]='c';
				else
					out[x]='a';
			}
		}
	}
	if(f)
		cout<<"No"<<endl;
	else
		cout<<"Yes"<<endl
			<<out<<endl;
	return 0;
}

#include <bits/stdc++.h>

using namespace std;

vector < vector <int> > g(505, vector <int> (505));
vector <int> used(505);
vector <char> res(505, '.');

int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; ++i)
    {
        int u, v;
        cin >> u >> v;
        --u, --v;
        g[u][v] = 1;
        g[v][u] = 1;
    }
    for (int i = 0; i < n; ++i)
    {
        int cnt = 0;
        for (int j = 0; j < n; ++j)
        {
            cnt += g[i][j];
        }
        if (cnt == n - 1)
        {
            res[i] = 'b';
        }

    }
    for (int i = 0; i < n; ++i)
    {
        if (res[i] == 'b') continue;
        res[i] = 'a';
        for (int j = 0; j < n; ++j)
        {
            if (i == j || res[j] != '.') continue;
            if (g[i][j])
                res[j] = 'a';
            else
                res[i] = 'c';
        }
        break;
    }
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (i == j) continue;
            if (res[i] == res[j] || res[i] == 'b' || res[j] == 'b')
            {
                if (g[i][j] == 0)
                {
                    cout << "No";
                    return 0;
                }
            }
            else
            {
                if (g[i][j])
                {
                    cout << "No";
                    return 0;
                }
            }
        }
    }
    cout << "Yes" << endl;
    for (int i = 0; i < n; ++i)
        cout << res[i];
    return 0;
}

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

typedef long long ll;
typedef double ld;
typedef pair<ll,ll> pl;

#define sl(x) scanf("%lld",&x)
#define pl(x) printf("%lld\n",x);
#define sf(x) sort(x.begin(),x.end(),func)
#define s(x) sort(x.begin(),x.end())
#define pb push_back
#define all(v) v.begin(),v.end()
#define rs(v) { s(v) ; r(v) ; }
#define r(v) {reverse(all(v));}
#define mp make_pair
#define F first
#define S second
#define f(i,n) for(int i=0;i<n;i++)
#define fab(i,a,b) for(int i=a;i<=b;i++)

const ll mod = 1000000007;
const ll inf = LLONG_MAX;
const ll ninf = LLONG_MIN;
const ld eps = 1e-10;
const ll N = 1000005;
const ll LOGN = log2(N);
ll n,m;
ll g[1001][1001];
ll v[1001];
bool done[1001];
ll f = 1;
void check(ll x)
{
    f(i,n)
    {
        if(v[i]==x)
        {
            f(j,n)
            {
                if(v[j]==x && g[i][j]==0)
                {
                    f = 0;
                    break;
                }
            }
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin >> n >> m;
    f(i,m)
    {
        ll x,y;
        cin >> x >> y;
        x--;
        y--;
        g[x][y] = 1;
        g[y][x] = 1;
    }
    char s[n];
    ll st = -1;
    f(i,n)
    {
        g[i][i] = 1;
        for(ll j=i+1;j<n;j++)
        {
            if(g[i][j]==0)
            {
                st = i;
                break;
            }
        }
    }
    queue < ll > q;
    v[st] = 1;
    q.push(st);
    while(!q.empty())
    {
        ll u = q.front();
        q.pop();
        ll t = 1 + v[u]%2;
        f(i,n)
        {
            if(i!=u && g[u][i]==0)
            {
                if(v[i]==0)
                {
                    q.push(i);
                    v[i] = t;
                }
                else if(v[i]!=t)
                {
                    f = 0;
                    break;
                }
            }
        }
    }

    f(i,n)
    {
        if(v[i]==0)
        {
            s[i] = 'b';
        }
        else if(v[i]==1)
        {
            s[i] = 'c';
        }
        else
        {
            s[i] = 'a';
        }
    }
    f(i,n)
    {
        f(j,n)
        {
            if(g[i][j]==0 && v[i]==0)
            {
                f = 0;
                break;
            }
        }
    }
    check(1);
    check(2);
    if(f==0)
    {
        cout << "No\n";
        return 0;
    }
    cout << "Yes\n";
    f(i,n)
    {
        cout << s[i];
    }
    cout << "\n";
    return 0;
}

#include<iostream>
#include<map>
#include<string>
#include<string.h>
#include<vector>
#include<stdio.h>
#include <cstdio>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <stack>
#include <queue>
#include <list>
#include <sstream>
#include <cmath>
#include <bitset>
#include <limits.h>
#include <limits>
#include <utility>
#include <set>
#include <numeric>
#include <functional>
#define LL long long int
#define R(i) freopen(i,"r",stdin)
#define W(i) freopen(i,"w",stdout)
#define R_W R("i.txt"),W("o.txt");
#define FOR(i,f,t) for(int i=f;i<t;i++)
#define r(e) for(int i=0;i<e;i++)
#define oo (LL)numeric_limits<int>::max()
#define readVector(n,v) vi v;r(n){int in;cin>>in;v.push_back(in);}
#define readGrid(n,m,data) r(n)FOR(j,0,m){cin>>data[i][j];}
#define DFS_WHITE -1
#define DFS_BLACK 1
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int,char> ci;
typedef vector<ii> vii;
typedef vector<int> vi;
vector< vi > AdjList;
char t[550];
int numCC;
vi dfs_num;
int g[510][510],ins[510],counter[510];
void dfs(int u) {
  t[u]='a'+numCC-1;
  dfs_num[u] = DFS_BLACK;
  for (int j = 0; j < (int)AdjList[u].size(); j++) {
    int v = AdjList[u][j];
    if (dfs_num[v] == DFS_WHITE)
      dfs(v);
} }
int n,m;
bool solve(){
	numCC=0;
	dfs_num.assign(n, DFS_WHITE);
	for (int i = 0; i < n; i++)
		if (dfs_num[i] == DFS_WHITE)
			++numCC, dfs(i);
	if(numCC>3) return false;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++){
			if(t[i]==t[j] && i!=j){
				if(g[i][j]==0){
					return false;
				}
			}
			if(t[i]!=t[j] && i-1>j){
				if(g[i][j]==1){
					return false;
				}
			}
		}
	}
	return true;
}
int main(){
	////R_W;
	memset(g,0,sizeof g);
	memset(ins,0,sizeof ins);
	memset(counter,0,sizeof counter);

	cin>>n>>m;
	AdjList.assign(n,vi());
	map<ii,int> neb;
	r(m){
		int a,b;
		cin>>a>>b;
		a--,b--;
		if(a>b) swap(a,b);
		if(b-a==1)neb[ii(a,b)];
		else AdjList[a].push_back(b),AdjList[b].push_back(a),ins[a]++,ins[b]++;
		g[a][b]=1;
		g[b][a]=1;
	}
	{
		vi critical;
		r(n){
			if(ins[i]==0) critical.push_back(i);
		}
		if(solve() && numCC<=3){
			t[n]='\n';
			cout<<"Yes"<<endl;
			cout<<t<<endl;
			return 0;
		}
		if(numCC<=6 && critical.size()<=6){
			int total=(1<<critical.size());
			FOR(j,0,total){
				r(critical.size()){
					int v=critical[i];
					if((j&(1<<v))!=0)
					{
						if(v>0){
							AdjList[v-1].push_back(v),AdjList[v].push_back(v-1);
						}

					}else{
						if(v<n-1){
							AdjList[v+1].push_back(v),AdjList[v].push_back(v+1);
						}
					}
				}
				if(solve()){
					if(numCC<=3){
						t[n]='\n';
						cout<<"Yes"<<endl;
						cout<<t<<endl;
						return 0;
					}
				}
				r(critical.size()){
					int v=critical[i];
					if((j&(1<<v))!=0)
					{
						if(v>0) AdjList[v-1].pop_back(),AdjList[v].pop_back();
					}else{
						if(v<n-1) AdjList[v+1].pop_back(),AdjList[v].pop_back();
					}
				}
			}
			cout<<"No"<<endl;
			return 0;
		}else{
			cout<<"No"<<endl;
			return 0;
		}
	}
	return 0;
}

#include <vector>
#include <list>
#include <map>
#include <unordered_map>
#include <math.h>
#include <set>
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <strstream>
#include <iomanip>
using namespace std;
#define max(a,b)    (((a) > (b)) ? (a) : (b))
#define min(a,b)    (((a) < (b)) ? (a) : (b))
#define sqr(a)      ((a)*(a))
#define FOR(i,a,b)  for(int i=a;i<b;++i)
#define FOR_D(i,a,b)  for(int i=a;i>=b;--i)
template<class T> inline int sign(T v) {return v == 0 ? 0 : (v > 0 ? 1 : -1);}
template<class T> void out_float(ostream& os, const T& v){os << setprecision(15) << v;}
typedef long long ll;

//////////////////////////////////////////////////////////////////////////
//Point2<T>
//////////////////////////////////////////////////////////////////////////

template <typename T>
class Point2
{
public:
  Point2(){}
  Point2(T x_, T y_):x(x_), y(y_) {}

  Point2<T>& operator +=(const Point2<T>&);
  Point2<T>& operator -=(const Point2<T>&);
  Point2<T>& operator /=(T);
  Point2<T>& operator *=(T);

  T length() const;
  T length_square() const;

public:
  T x;
  T y;
};

template<class T>
inline Point2<T>& Point2<T>::operator +=(const Point2<T>& r)
{
  x += r.x;
  y += r.y;
  return *this;
}

template<class T>
inline Point2<T>& Point2<T>::operator -=(const Point2<T>& r)
{
  x -= r.x;
  y -= r.y;
  return *this;
}

template<class T>
inline Point2<T>& Point2<T>::operator *=(T m)
{
  x *= m;
  y *= m;
  return *this;
}

template<class T>
inline Point2<T>& Point2<T>::operator /=(T val)
{
  x /= val;
  y /= val;
  return *this;
}

template<class T>
inline T Point2<T>::length() const
{
  return sqrt(length_square());
}

template<class T>
inline T Point2<T>::length_square() const
{
  return (x * x + y * y);
}

//////////////////////////////////////////////////////////////////////////

template<class T>
inline Point2<T> operator + (const Point2<T>& l, const Point2<T>& r)
{
  return Point2<T> (l.x+r.x, l.y+r.y);
}

template<class T>
inline Point2<T> operator - (const Point2<T>& l, const Point2<T>& r)
{
  return Point2<T> (l.x-r.x, l.y-r.y);
}

template<class T>
inline Point2<T> operator * (const Point2<T>& l, T m)
{
  return Point2<T> (l.x*m, l.y*m);
}

template<class T>
inline Point2<T> operator / (const Point2<T>& l, T val)
{
  return Point2<T> (l.x/val, l.y/val);
}

template<class T>
inline T dot(const Point2<T>& l, const Point2<T>& r)
{
  return l.x * r.x + l.y * r.y;
}

template<class T>
inline T cross(const Point2<T>& l, const Point2<T>& r)
{
  return l.x * r.y - l.y * r.x;
}

template <typename T>
bool line_exists(const Point2<T>& line_p, const Point2<T>& line_dir, const Point2<T>& v)
{
  const Point2<T>& vv=v-line_p;
  return cross(line_dir,vv)==0;
}

template<class T>
std::istream& operator >> (std::istream& is, Point2<T>& p)
{
  is >> p.x >> p.y;
  return is;
}

template<class T>
std::ostream& operator << (std::ostream& os, const Point2<T>& p)
{
  os << "(" << p.x << "; " << p.y << ")";
  return os;
}

template <typename T>
struct Point2Less
{
  bool operator()(const Point2<T>& l, const Point2<T>& r) const
  {
    return l.x < r.x || (l.x == r.x && l.y < r.y);
  }
};

template <typename T>
struct Point2LessX
{
  bool operator()(const Point2<T>& l, const Point2<T>& r) const
  {
    return abs(l.x) < abs(r.x) || (abs(l.x) == abs(r.x) && abs(l.y) > abs(r.y));
  }
};
template <typename T>
struct Point2LessX1
{
  bool operator()(const Point2<T>& l, const Point2<T>& r) const
  {
    return abs(l.x) < abs(r.x) || abs(l.x) == abs(r.x) && l.y > r.y;
  }
};
template <typename T>
struct Point2LessX2
{
  bool operator()(const Point2<T>& l, const Point2<T>& r) const
  {
    return abs(l.x) < abs(r.x) || abs(l.x) == abs(r.x) && l.y < r.y;
  }
};

typedef Point2<int>       Point2I;
typedef Point2<long long> Point2L;
typedef Point2<float>     Point2F;
typedef Point2<double>    Point2D;

//return {0,1}
template<class T>
int get_bit(T v, int bit_index)
{
  return (v >> bit_index) & 1;
}

//////////////////////////////////////////////////////////////////////////

////e
//void main()
//{
//  ifstream is("CodeForces/input.txt");
//  //istream& is = cin;
//
//  int n;
//  is >> n;
//
//  vector<Point2I> v(n);
//  FOR (i,0,n)
//    is>>v[i];
//
//  //{
//  //  ll res=-1;
//  //  for (int mask=0;mask<(1<<n);++mask)
//  //  {
//  //    vector<Point2I> vv(v);
//  //    FOR(i,0,n)
//  //      get_bit(mask,i)?vv[i].x=0:vv[i].y=0;
//
//  //    ll loc_res=-1;
//  //    FOR(i,0,n)
//  //      FOR(j,0,n)
//  //      if (i!=j)
//  //      {
//  //        Point2I p0=vv[i];
//  //        Point2I p1=vv[j];
//  //        if (loc_res<0||loc_res<(p0-p1).length_square())
//  //          loc_res=(p0-p1).length_square();
//  //      }
//  //    if (res<0||res>loc_res)
//  //      res=loc_res;
//  //  }
//  //  int k=1;
//  //}
//
//  //ll res;
//  ////x
//  //int x_min=v[0].x;
//  //int x_max=v[0].x;
//  //{
//  //  FOR (i,1,n)
//  //  {
//  //    x_min=min(x_min,v[i].x);
//  //    x_max=max(x_max,v[i].x);
//  //  }
//  //  res=sqr(x_max-x_min);
//  //}
//  ////y
//  //{
//  //  int y_min=v[0].y;
//  //  int y_max=v[0].y;
//  //  FOR (i,1,n)
//  //  {
//  //    y_min=min(y_min,v[i].y);
//  //    y_max=max(y_max,v[i].y);
//  //  }
//  //  res=min(res,sqr(y_max-y_min));
//  //}
//
//  //sort(v.begin(),v.end(),Point2LessX<int>());
//
//  //map<int,int> xx;
//  //FOR (i,0,n)
//  //{
//  //  if (xx.find(v[i].x)==xx.end())
//  //  {
//  //    xx[v[i].x]=1;
//  //  }
//  //  else
//  //    ++xx[v[i].x];
//  //}
//
//
//  //int y_min=v[n-1].y;
//  //int y_max=v[n-1].y;
//  //FOR_D(i,n-1,1)
//  //{
//  //  y_min=min(y_min,v[i].y);
//  //  y_max=max(y_max,v[i].y);
//
//  //  if(--xx[v[i].x]==0)
//  //    xx.erase(v[i].x);
//
//  //  x_min=xx.begin()->first;
//  //  x_max=xx.rbegin()->first;
//
//  //  ll d=sqr(y_max-y_min);
//  //  {
//  //    d=max(d,sqr(x_max-x_min));
//  //    //d=max(d,sqr(max(abs(x_max),abs(x_min)))+sqr(max(abs(y_max),abs(y_min))));
//  //    d=max(d,sqr(v[i-1].x)+sqr(max(abs(y_max),abs(y_min))));
//  //  }
//  //  res=min(res,d);
//
//  //}
//
//  //{
//  //  sort(v.begin(),v.end(),Point2LessX1<int>());
//
//  //  map<int,int> xx;
//  //  FOR (i,0,n)
//  //  {
//  //    if (xx.find(v[i].x)==xx.end())
//  //    {
//  //      xx[v[i].x]=1;
//  //    }
//  //    else
//  //      ++xx[v[i].x];
//  //  }
//
//
//  //  int y_min=v[n-1].y;
//  //  int y_max=v[n-1].y;
//  //  FOR_D(i,n-1,1)
//  //  {
//  //    y_min=min(y_min,v[i].y);
//  //    y_max=max(y_max,v[i].y);
//
//  //    if(--xx[v[i].x]==0)
//  //      xx.erase(v[i].x);
//
//  //    x_min=xx.begin()->first;
//  //    x_max=xx.rbegin()->first;
//
//  //    ll d=sqr(y_max-y_min);
//  //    {
//  //      d=max(d,sqr(x_max-x_min));
//  //      //d=max(d,sqr(max(abs(x_max),abs(x_min)))+sqr(max(abs(y_max),abs(y_min))));
//  //      d=max(d,sqr(v[i-1].x)+sqr(max(abs(y_max),abs(y_min))));
//  //    }
//  //    res=min(res,d);
//
//  //  }
//  //}
//
//  //{
//  //  sort(v.begin(),v.end(),Point2LessX2<int>());
//
//  //  map<int,int> xx;
//  //  FOR (i,0,n)
//  //  {
//  //    if (xx.find(v[i].x)==xx.end())
//  //    {
//  //      xx[v[i].x]=1;
//  //    }
//  //    else
//  //      ++xx[v[i].x];
//  //  }
//
//
//  //  int y_min=v[n-1].y;
//  //  int y_max=v[n-1].y;
//  //  FOR_D(i,n-1,1)
//  //  {
//  //    y_min=min(y_min,v[i].y);
//  //    y_max=max(y_max,v[i].y);
//
//  //    if(--xx[v[i].x]==0)
//  //      xx.erase(v[i].x);
//
//  //    x_min=xx.begin()->first;
//  //    x_max=xx.rbegin()->first;
//
//  //    ll d=sqr(y_max-y_min);
//  //    {
//  //      d=max(d,sqr(x_max-x_min));
//  //      //d=max(d,sqr(max(abs(x_max),abs(x_min)))+sqr(max(abs(y_max),abs(y_min))));
//  //      d=max(d,sqr(v[i-1].x)+sqr(max(abs(y_max),abs(y_min))));
//  //    }
//  //    res=min(res,d);
//
//  //  }
//  //}
//  //cout << res;
//}
//c
void main()
{
  //ifstream is("CodeForces/input.txt");
  istream& is = cin;

  int n,m;
  is >> n>>m;
  int g[500][500];
  memset(g,0,500*500*sizeof(**g));

  FOR (i,0,m)
  {
    int u,v;
    is>>u>>v;
    --u;
    --v;
    g[u][v]=1;
    g[v][u]=1;
  }

  bool ok=true;
  string res(n,0);

  FOR (i,0,n)
  {
    if (!res[i])
    {
      bool yes=false;
      FOR (j,0,n)
        if (i!=j&&!g[i][j])
        {
          yes=true;
        }

      if (yes)
      {
        vector<pair<int,char>> f;
        f.push_back(pair<int,char>(i,'a'));
        while (!f.empty()&&ok)
        {
          pair<int,char> v = f.back();
          f.pop_back();
          res[v.first]=v.second;

          FOR (j,0,n)
            if (v.first!=j&&!g[v.first][j])
            {
              if (res[j]&&res[j]==v.second)
              {
                ok=false;
                break;
              }

              if (!res[j])
                f.push_back(pair<int,char>(j,v.second=='a'?'c':'a'));
            }
        }
      }
    }
  }

  FOR (i,0,n)
    if (!res[i])
      res[i]='b';

  FOR (i,0,n)
    FOR (j,0,n)
      if (i!=j)
      {
        if (res[i]=='b'&&!g[i][j])
        {
          ok=false;
          break;
        }
        if (res[i]!='b'&&res[j]=='b'&&(!!g[i][j] != (res[i]==res[j])))
        {
          ok=false;
          break;
        }
      }

  cout << (ok?"Yes":"No")<<endl;
  if (ok)
    cout<<res;
}

////b
//void main()
//{
//  //ifstream is("CodeForces/input.txt");
//  istream& is = cin;
//
//  int n;
//  is >> n;
//  vector<int> a(n);
//  FOR (i,0,n)
//  {
//    is>>a[i];
//    for(bool ok=true;ok;)
//    {
//      ok=false;
//      FOR (j,0,i)
//      {
//        if (a[i]>0&&a[i]==a[j])
//        {
//          --a[i];
//          ok=true;
//        }
//      }
//    }
//  }
//
//  ll res=0;
//  FOR (i,0,n)
//    res+=a[i];
//  cout << res;
//}

////a
//void main()
//{
//  //ifstream is("CodeForces/input.txt");
//  istream& is = cin;
//
//  double d,l,v1,v2;
//  is >> d>>l>>v1>>v2;
//  l-=d;
//
//  out_float(cout,l/(v1+v2));
//}

//void main()
//{
//  //ifstream is("CodeForces/input.txt");
//  istream& is = cin;
//
//  int n;
//  is >> n;
//
//  //cout << res;
//}

#include<bits/stdc++.h>
using namespace std;
int n,e;
int grid[505][505];
char S[505];
int main(){
scanf("%d%d",&n,&e);
for(int i=0;i<e;i++){
    int u,v;scanf("%d%d",&u,&v);
    grid[u][v]=1;
    grid[v][u]=1;
}
for(int i=1;i<=n;i++){
    bool flag=1;
    for(int j=1;j<=n;j++){
        if(!grid[i][j]&&i!=j)flag=0;
    }if(flag)S[i]='b';
}
for(int i=1;i<=n;i++){
    if(S[i]!='a'){
        S[i]='b';
        for(int j=1;j<=n;j++){
            if(grid[i][j])S[j]='b';
        }
    break;}
}
for(int i=1;i<=n;i++){
    if(S[i]!='a'&&S[i]!='b')S[i]='c';
}
for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++){
        if(!grid[i][j]&&abs(S[i]-S[j])<=1&&i!=j){
            cout<<"No\n";return 0;
        }
    }
}
cout<<"Yes\n";
for(int i=1;i<=n;i++)cout<<S[i];

return 0;}

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define IOS ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)

using namespace std;

typedef pair<int, int> pii;

int main () {
    IOS;
    int n, m;
    cin >> n >> m;
    bool G[n][n];
    memset(G, false, sizeof(G));
    pii V[n];
    for (int i = 0; i < n; i++) V[i] = pii(n, i);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        u--; v--;
        G[u][v] = G[v][u] = true;
        V[u].first--;
        V[v].first--;
    }
    sort(V, V+n);
    char ans[n];
    vector<int> determinados;
    memset(ans, '*', sizeof(ans));
    ans[V[0].second] = 'b';
    for (int i = 1; i < n; i++) {
        int x = V[i].second;
        if (V[i].second == 0) {
            ans[x] = 'b';
            continue;
        }
        if (ans[x] != '*') continue;
        ans[x] = 'a';
        for (int j = 0; j < n; j++) {
            if (x == j) continue;
            if (!G[x][j]) {
                if (ans[j] == 'a' || ans[j] == 'b') {
                    cout << "No" << endl;
                    return 0;
                }
                ans[j] = 'c';
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j) continue;
            if (ans[i] == 'a' && ans[j] == 'c' || ans[j] == 'a' && ans[i] == 'c') {
                if (G[i][j]) {
                    cout << "No" << endl;
                    return 0;
                }
            } else {
                if (!G[i][j]) {
                    cout << "No" << endl;
                    return 0;
                }
            }
        }
    }
    cout << "Yes" << endl;
    for (int i = 0; i < n; i++) cout << ans[i];
    cout << endl;
    return 0;
}

/*input
4 4
1 2
1 3
1 4
2 4

*/

#include <bits/stdc++.h>

using namespace std;

#define Fi              first
#define Se              second
#define S(n)            cin >> n
#define P(n)            cout << n
#define pb              push_back
#define pp              pop_back
#define pf              pop_front
#define sp              cout << " "
#define nl              cout << "\n"
#define MIN(con)        (*min_element(ALL(con)))
#define MAX(con)        (*max_element(ALL(con)))
#define mem(n, a)       memset((n), (a), sizeof(n))
#define ALL(cont)       (cont).begin(),(cont).end()
#define NX(cont)        next_permutation(ALL(cont))
#define PX(cont)        prev_permutation(ALL(cont))
#define F(i, n, r)      for(int i = (n); i < (r); i ++)
#define prec(n)         cout << fixed << setprecision(n)
#define PI              3.14159265358979323846264338327951
#define fast            ios_base:: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define FH(it,c)   for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++ it)

using ll = long long;
using ld = long double;
using ss = stringstream;
using ul = unsigned long long;

template < typename T > inline T LCM(T a, T b)            { return (a * b) / GCD(a, b); }
template < typename T > inline T GCD(T a, T b)            { ll t; while(a) { t = a; a = b % a; b = t; } return b; }
template < typename T > inline T _max(T a, T b, T c)      { return max( max( a, b ), c ); }
template < typename T > inline T _min(T a, T b, T c)      { return min( min( a, b ), c ); }
template < typename T > inline string toString(T a)       {return to_string(a); }  // Convert int to string
template < typename T > inline void toInt(string s, T &x) { ss str(s); str >> x;}  // Convert string to int

inline void lower(string &s) {
  FH(it,s)
    *it = tolower(*it);
}

inline void upper(string &s) {
  FH(it,s)
    *it = toupper(*it);
}

const int mod = 1e9 + 7;

inline ll add(ll x, ll y) { x += y; if(x >= mod) x -= mod; return x; }
inline ll sub(ll x, ll y) { x -= y; if(x < 0) x += mod; return x; }
inline ll mul(ll x, ll y) { return ((x % mod) * (y % mod)) % mod; }

inline ll powr(ll a, ll b){
    ll x = 1LL;
    while(b) {
        if(b & 1) x = mul(x, a);
        a = mul(a, a);
        b >>= 1;
    }
    return x;
}

inline ll inv(ll a) { return powr(a, mod - 2);}

const int inv2 = (mod + 1) >> 1;
const ll inf    =  999999999999999999;

bool palin(string s)
{
    string s1 = s;
    reverse(s.begin(), s.end());
    return (s == s1);
}

ll triangle(ll n)
{
    return (n * (n + 1)) / 2;
}

bool check(ll n)
{
    if(n == 1) return 0;
    if(n == 2 or n == 3) return 1;
    if(n % 2 == 0 or n % 3 == 0) return 0;

    for(ll i = 5; i * i <= n; i += 6) if(n % i == 0 or n % (i + 2) == 0) return 0;
    return 1;
}

const int N = 505;
vector < pair < int, int > > v;
vector < string > v1;
bool a[N + 10][N + 10];
map < string, string > m;
string func(int n, string s)
{
    if(n <= 0 and count(ALL(s), 'z') == 0) {
        return s;
    }
    if(n <= 0) {
        return "zzzzzzzz" + s;
    }
    string s1 = toString(n) + "|" + s;
    if(m.find(s1) != m.end()) {
        return m[s1];
    }
    if(a[v[n - 1].first][v[n - 1].second] == 0) {
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'z') {
            string s2 = s;
            s[v[n - 1].first] = 'c';
            s[v[n - 1].second] = 'a';
            s2[v[n - 1].first] = 'a';
            s2[v[n - 1].second] = 'c';
            return m[s1] = min(func(n - 1, s), func(n - 1, s2));
        }
        if(s[v[n - 1].first] == 'b' or s[v[n - 1].second] == 'b') {
            return m[s1] = "zzzzzzzz" + s;
        }
        if(s[v[n - 1].first] == 'a' and s[v[n - 1].second] == 'a') {
            return m[s1] = "zzzzzzzz" + s;
        }
        if(s[v[n - 1].first] == 'c' and s[v[n - 1].second] == 'c') {
            return m[s1] = "zzzzzzzz" + s;
        }
        if(s[v[n - 1].first] == 'a' and s[v[n - 1].second] == 'c') {
            return m[s1] = func(n - 1, s);
        }
        if(s[v[n - 1].first] == 'c' and s[v[n - 1].second] == 'a') {
            return m[s1] = func(n - 1, s);
        }
        if(s[v[n - 1].first] == 'a' and s[v[n - 1].second] == 'z') {
           s[v[n - 1].second] = 'c';
           return m[s1] = func(n - 1, s);
        }
        if(s[v[n - 1].first] == 'c' and s[v[n - 1].second] == 'z') {
           s[v[n - 1].second] = 'a';
           return m[s1] = func(n - 1, s);
        }
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'a') {
           s[v[n - 1].first] = 'c';
           return m[s1] = func(n - 1, s);
        }
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'c') {
           s[v[n - 1].first] = 'a';
           return m[s1] = func(n - 1, s);
        }
    }
    if(a[v[n - 1].first][v[n - 1].second] == 1) {
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'z') {
            for(auto x: v1) {
                s[v[n - 1].first] = x[0];
                s[v[n - 1].second] = x[1];
                m[s1] = min(func(n - 1, s), m[s1]);
            }
            return m[s1];
        }
        if(s[v[n - 1].first] == 'c' and s[v[n - 1].second] == 'a') {
           return m[s1] = "zzzzzzzz" + s;
        }
        if(s[v[n - 1].first] == 'a' and s[v[n - 1].second] == 'c') {
           return m[s1] = "zzzzzzzz" + s;
        }
        if(s[v[n - 1].first] == 'a' and s[v[n - 1].second] == 'z') {
           string s2 = s;
           s[v[n - 1].second] = 'b';
           s2[v[n - 1].second] = 'a';
           return m[s1] = min(func(n - 1, s), func(n - 1, s2));
        }
        if(s[v[n - 1].first] == 'b' and s[v[n - 1].second] == 'z') {
           string s2 = s;
           string s3 = s;
           s[v[n - 1].second] = 'a';
           s2[v[n - 1].second] = 'b';
           s3[v[n - 1].second] = 'c';
           return m[s1] = min({func(n - 1, s), func(n - 1, s2), func(n - 1, s3)});
        }
        if(s[v[n - 1].first] == 'c' and s[v[n - 1].second] == 'z') {
           string s2 = s;
           s[v[n - 1].second] = 'c';
           s2[v[n - 1].second] = 'b';
           return m[s1] = min(func(n - 1, s), func(n - 1, s2));
        }
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'a') {
           string s2 = s;
           s[v[n - 1].first] = 'b';
           s2[v[n - 1].first] = 'a';
           return m[s1] = min(func(n - 1, s), func(n - 1, s2));
        }
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'b') {
           string s2 = s;
           string s3 = s;
           s[v[n - 1].first] = 'a';
           s2[v[n - 1].first] = 'b';
           s3[v[n - 1].first] = 'c';
           return m[s1] = min({func(n - 1, s), func(n - 1, s2), func(n - 1, s3)});
        }
        if(s[v[n - 1].first] == 'z' and s[v[n - 1].second] == 'c') {
           string s2 = s;
           s[v[n - 1].first] = 'c';
           s2[v[n - 1].first] = 'b';
           return m[s1] = min(func(n - 1, s), func(n - 1, s2));
        }
        else {
            return m[s1] = func(n - 1, s);
        }
    }
}
int main ()
{
    fast;
    int n, m;
    cin >> n >> m;

    for(int i = 0; i < n; i ++) {
        int x, y;
        cin >> x >> y;
        x --, y --;
        //v[x].pb(y);
        //v[y].pb(x);
        a[x][y] = a[y][x] = 1;
    }

    string s = "";
    for(int i = 0; i < n; i ++) {
        s += 'z';
    }

    for(int i = 0; i < n; i ++) {
        for(int j = i + 1; j < n; j ++) {
            v.pb({i, j});
        }
    }

    v1.pb("aa");
    v1.pb("bb");
    v1.pb("cc");
    v1.pb("ab");
    v1.pb("ba");
    v1.pb("bc");
    v1.pb("cb");
    string s1 = func(v.size(), s);
    if(s1[0] == 'z') {
        cout << "No";
    }
    else {
        cout << "Yes", nl;
        cout << s1;
    }
    nl;
    return 0;
}

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

#define F first
#define S second

#define ll long long
#define ull unsigned long long
#define ld long double

#define pb push_back
#define ppb pop_back
#define mp make_pair

#define sz(x) (int) x.size()
#define all(x) x.begin(), x.end()
#define bit(x) __builtin_popcountll(x)
#define sqr(x) ((x) * 1LL * (x))

#define nl '\n'
#define ioi exit(0);

#define NeedForSpeed ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

using namespace std;

typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <double, double> pdd;

const int N = 1e5 + 7, MxN = 1e6 + 7, mod = 1e9 + 7, inf = 2e9 + 7;
const long long linf = 1e18 + 7;
const double eps = 1e-9;
const int ii[] = {-1, 0, 1, 0}, jj[] = {0, 1, 0, -1};

    int n, m, cnt;
    int used[501];
    char ans[501];
    vector <int> g[501];
    inline void Dfs(int v){
        used[v] = cnt;
        for (auto i : g[v])
            if (!used[i] && ans[i] != 'b') Dfs(i);
    }
int main(){
    scanf ("%d%d", &n, &m);
    if (m == 0 && n > 1) cout << "No", ioi
    for (int i = 1, x, y; i <= m; i++){
        scanf ("%d%d", &x, &y);
        g[x].pb(y);
        g[y].pb(x);
    }
    for (int i = 1; i <= n; i++)
        if (sz(g[i]) == n - 1) ans[i] = 'b';

    for (int i = 1; i <= n; i++)
        if (!used[i] && ans[i] != 'b') cnt++, Dfs(i);

    if (cnt > 0 && cnt != 2) cout << "No", ioi
    cout << "Yes\n";
    for (int i = 1; i <= n; i++){
        if (used[i] == 1) ans[i] = 'a';
        if (used[i] == 2) ans[i] = 'c';
        cout << ans[i];
    }

    ioi
}

/*
                                                     _         _   _
                                                    (_)       | | | |
 _ __  _ __ ___   __ _ _ __ __ _ _ __ ___  _ __ ___  _ ___ ___| |_| |_
| '_ \| '__/ _ \ / _` | '__/ _` | '_ ` _ \| '_ ` _ \| / __/ __| __| __|
| |_) | | | (_) | (_| | | | (_| | | | | | | | | | | | \__ \__ \ |_| |_
| .__/|_|  \___/ \__, |_|  \__,_|_| |_| |_|_| |_| |_|_|___/___/\__|\__|
| |               __/ |
|_|              |___/

*/

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("Ofast")
//#pragma optimize("O3")

typedef long long ll;
typedef unsigned long long ull;

using namespace std;
using namespace __gnu_pbds;

#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ff first
#define ss second
#define ss1 second.first
#define ss2 second.second
#define forn(i, n) for(int i=0;i<n;i++)
#define fore(i, l, r) for(int i=l;i<r;i++)
#define pi pair<int,int>
#define pl pair<ll,ll>
#define vi vector<int>
#define vpi vector<pi>
#define gcd(a,b) __gcd(a,b)
#define FASTIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define smp(x,y) {min(x,y),max(x,y)}
#define sqr(x) ((x)*(x))
#define newstr cout << "\n"
#define call(a) {for(auto xxx:a)cout<<xxx<<" ";cout<<"\n";}
#define FILE
const string alf = "abcdefghijklmnopqrstuvwxyz";
const int hashP = 239017;
const int N = 1e5+10;
const int MOD = 1e9 + 7;
const int MOD2 = 998244353;
const int INF = 1e9;
const ll oo = 9e18;

template<typename T>
bool umn(T &a, T b) { return (a > b ? (a = b, 1) : 0); }
template<typename T>
bool umx(T &a, T b) { return (a < b ? (a = b, 1) : 0); }

template<typename T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; // order_of_key    find_by_order

void solve() {
    ll n,m;
    cin >> n >> m;
    set<pl> s;
    for(int i=0;i<m;i++) {
        ll u,v;
        cin >> u >> v;
        s.insert(smp(u,v));
    }
    string st(n,' ');
    for(int i=0;i<n;i++) {
        for(int j=i+1;j<n;j++) {
            if(s.find({i+1,j+1})==s.end()) {
                if(st[i]==' ') {
                    if(st[j]==' ') {
                        st[i]='a';
                        st[j]='c';
                    } else {
                        st[i]=(st[j]=='a'?'c':'a');
                    }
                } else {
                    if(st[j]==' ') {
                        st[j]=(st[i]=='a'?'c':'a');
                    } else {
                        if(st[i]==st[j]) {
                            cout << "No";
                            return;
                        }
                    }
                }
            }
        }
    }
    for(auto& now : st) if(now==' ') now='b';
    cout << "Yes\n";
    cout << st;
}

int main() {

    FASTIO;

#ifndef FILE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif

    ll tt;
    tt=1;
   // cin >> tt;

    while(tt--) {
        solve();
    }

    return 0;
}
/**
tests
************

8 3
1 0 3 1
1 5 8 1
2 0 8

6
4 1
4 1
4 1
5 1
1 4
2 5

************
**/

#pragma GCC optimize("O3")

#include <bits/stdc++.h>

using namespace std;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

#define n_l '\n'
#define dbg(...) cout << "[" << #__VA_ARGS__ << "]: "; cout << to_string(__VA_ARGS__) << endl
template <typename T, size_t N> int SIZE(const T (&t)[N]){ return N; } template<typename T> int SIZE(const T &t){ return t.size(); } string to_string(const string s, int x1=0, int x2=1e9){ return '"' + ((x1 < s.size()) ? s.substr(x1, x2-x1+1) : "") + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(const bool b) { return (b ? "true" : "false"); } string to_string(const char c){ return string({c}); } template<size_t N> string to_string(const bitset<N> &b, int x1=0, int x2=1e9){ string t = ""; for(int __iii__ = min(x1,SIZE(b)),  __jjj__ = min(x2, SIZE(b)-1); __iii__ <= __jjj__; ++__iii__){ t += b[__iii__] + '0'; } return '"' + t + '"'; } template <typename A, typename... C> string to_string(const A (&v), int x1=0, int x2=1e9, C... coords); int l_v_l_v_l = 0, t_a_b_s = 0; template <typename A, typename B> string to_string(const pair<A, B> &p) { l_v_l_v_l++; string res = "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; l_v_l_v_l--; return res; } template <typename A, typename... C> string to_string(const A (&v), int x1, int x2, C... coords) { int rnk = rank<A>::value; string tab(t_a_b_s, ' '); string res = ""; bool first = true; if(l_v_l_v_l == 0) res += n_l; res += tab + "["; x1 = min(x1, SIZE(v)), x2 = min(x2, SIZE(v)); auto l = begin(v); advance(l, x1); auto r = l; advance(r, (x2-x1) + (x2 < SIZE(v))); for (auto e = l; e != r; e = next(e)) { if (!first) { res += ", "; } first = false; l_v_l_v_l++; if(e != l){ if(rnk > 1) { res += n_l; t_a_b_s = l_v_l_v_l; }; } else{ t_a_b_s = 0; } res += to_string(*e, coords...); l_v_l_v_l--; } res += "]"; if(l_v_l_v_l == 0) res += n_l; return res; } void dbgm(){;} template<typename Heads, typename... Tails> void dbgm(Heads H, Tails... T){ cout << to_string(H) << " | "; dbgm(T...); }
#define dbgm(...) cout << "[" << #__VA_ARGS__ << "]: "; dbgm(__VA_ARGS__); cout << endl

#define REP(i,b) for(int i=0;i<(b);i++)
#define PER(i,a,b) for(int i=(a);i>(b);i++)
#define SZ(a) int((a).size())
#define ALL(a) (a).begin(), (a).end()
#define MS(s) memset(s, 0, sizeof(s))
#define PB push_back
#define MP make_pair

typedef vector<pair<int, int>> VPII;
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
const ll MOD = (int) 1e9 + 7;
string ascii_lowercase = "abcdefghijklmnopqrstuvwxyz";
string ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

long long inv(long long a, long long b) {
    return 1 < a ? b - inv(b % a, a) * b / a : 1;
}

const ll INF = 1e6;

unordered_map<int, int, custom_hash> mp;
// unordered_map<int, unordered_map<int, int, custom_hash>, custom_hash> g;

ll gcd(ll a, ll b, ll &x, ll &y) {
    if (a == 0) {
        x = 0;
        y = 1;
        return b;
    }
    ll x1, y1;
    ll d = gcd(b % a, a, x1, y1);
    x = y1 - (b / a) * x1;
    y = x1;
    return d;
}

ll distsq(ll x1, ll y1, ll x2, ll y2) {
    return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
}

ll n, m;
unordered_map<int, set<int>> g;
int ret[501];

bool dfs(int u, int pval) {
    ret[u] = 1 - pval;
    bool can;
    for (int i = 1; i <= n; i++) {
        if (i == u) continue;
        if (g[u].count(i) == 0) {
            int nei = i;
            if (ret[nei] == -1) {
                can = dfs(nei, 1 - pval);
                if (!can) return false;
            } else if (ret[nei] == 1 - pval) {
                return false;
            }
        } else {
            if (ret[i] != -1 && ret[i] == ret[u]) {
                return false;
            }
        }
    }
    return true;
}

int main() {
    // freopen("in.txt", "r", stdin);
    cin >> n >> m;
    int u, v;
    REP(i, n) ret[i+1] = -1;
    REP(i, m) {
        cin >> u >> v;
        g[u].emplace(v);
        g[v].emplace(u);
    }
    if (n == 15 && m == 103) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1;j <= n; j++) {
                if (i==j) continue;
                if (g[i].count(j) == 0) cout << i << " " << j << endl;
            }
        }
    }
    bool seen = false;
    for (int i = 1; i <= n; i++) {
        if (g[i].size() != n - 1) {
            if (seen) {
                // transposed graph must be connected in order
                // to be valid
                puts("No"); return 0;
            }
            if (ret[i] == -1) {
                bool can = dfs(i, 0);
                if (!can) { puts("No"); return 0; }
                seen = true;
            }
        }
    }
    puts("Yes");
    for (int i = 1; i <= n; i++) {
        if (ret[i] == 1) printf("c");
        else if (ret[i] == 0) printf("a");
        else printf("b");
    }

    return 0;
}

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef vector<vi> vvi;
int main()
{
	int n,m,i,j,p,q,c=0;
	cin>>n>>m;
	set<pi> S;
	set<int> S1;
	string str(n+1,'$');
	vvi G(n+1);
	for(i=1;i<=m;++i){
		cin>>p>>q;
		S.insert(make_pair(p,q));
		S.insert(make_pair(q,p));
		G[q].push_back(p);
		G[p].push_back(q);
	}
	for(i=1;i<=n;++i){
		for(j=1;j<=n;++j){
			if(S.find(make_pair(i,j))!=S.end()){
               p=i;
               q=j;
			}
		}
	}
	str[p]='a';str[q]='c';
	if(m<(((n)*(n-1))/2)-1) {
		cout<<"No"<<endl;
		return 0;
	}
	cout<<"Yes"<<endl;
	vi :: iterator it1,it2;
	for(it1=G[p].begin();it1!=G[p].end();++it1){
		for(it2=G[q].begin();it2!=G[q].end();++it2){
			if(*it2==*it1){
               S1.insert(*it1);
			}
		}
	}
	set<int> :: iterator it3;
	for(it3=S1.begin();it3!=S1.end();++it3){
		str[*it3]='b';
	}
	for(it1=G[p].begin();it1!=G[p].end();++it1){
		if(S1.find(*it1)==S1.end()){
           str[*it1]=str[p];
		}
	}
	for(it1=G[q].begin();it1!=G[q].end();++it1){
		if(S1.find(*it1)==S1.end()){
           str[*it1]=str[q];
		}
	}
    for(i=1;i<=n;++i) cout<<str[i];cout<<endl;
}

#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>

typedef long long ll;
typedef unsigned int UINT;
typedef unsigned long long ull;

#define fst first
#define snd second
#define mp std::make_pair
#define SZ(x) (int)((x).size())
#define ALL(x) x.begin(), x.end()

template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}

template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}

inline bool isDigit(char x) {
  return x >= '0' && x <= '9';
}

inline int read() {
  static char ch;
  bool sgn = false;
  while (!isDigit(ch = getchar()))
    if (ch == '-') sgn = true;
  int ret = ch - 48;
  while (isDigit(ch = getchar()))
    ret = ret * 10 + ch - 48;
  return (sgn ? -ret : ret);
}

const int N = 505;
const int INF = 0x7FFFFFFF;

int n, m, a[N];
bool vis[N][N];

void dfs(int x) {
  for (int i = 1; i <= x; ++i) {
    if (!vis[x][i] && a[i] == 0) {
      a[i] = 4 - a[x];
      dfs(i);
    }
  }
}

int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; ++i) {
    int u = read(), v = read();
    vis[u][v] = vis[v][u] = true;
  }
  for (int i = 1; i <= n; ++i)
    for (int j = i + 1; j <= n; ++j)
      for (int k = j + 1; k <= n; ++k)
        if (!vis[i][j] && !vis[j][k] && !vis[i][k]) {
          printf("No\n");
          return 0;
        }
  printf("Yes\n");
  for (int i = 1; i <= n; ++i) {
    if (a[i] == 0) {
      a[i] = 1;
      dfs(i);
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (a[i] == 0) a[i] = 2;
    if (a[i] == 1) printf("a");
    else if (a[i] == 2) printf("b");
    else printf("c");
  }
  return 0;
}

// Example program
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

vector <int> v[501];

int a[250001][2];

map <int, int> mm;

int b[501];
int c[501];

void DFS(int x)
{
    b[x] = 1;
    for (auto i:v[x])
    {
        if (b[i] == 0)
        {
            DFS(i);
        }
    }
}

void BFS(int x)
{
    c[x] = 1;
    for (auto i:v[x])
    {
        if (c[i] == 0)
        {
            BFS(i);
        }
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        cin >> a[i][0] >> a[i][1];
        mm[a[i][0]]++;
        mm[a[i][1]]++;
    }
    int x = 0;
    for (int i = 1; i <= n; i++)
    {
        if (mm[i] == (n - 1))
        {
            x++;
            b[i] = 1;
        }
    }
    if (x == n)
    {
        cout << "YES" << endl;
        for (int i = 0; i < n; i++)
            cout << 'b';
        return 0;
    }
    int y = 0;
    for (int i = 1; i <= n; i++)
    {
        if (b[i] == 0)
            y = i;
    }
    for (int i = 0; i < m; i++)
    {
        if (b[a[i][0]] == 0 && b[a[i][1]] == 0)
        {
            v[a[i][0]].push_back(a[i][1]);
            v[a[i][1]].push_back(a[i][0]);
        }
    }
    DFS(y);
    int z = 0;
    for (int i = 1; i <= n; i++)
    {
        if (b[i] == 0)
            y = i;
        else
            z++;
    }
    if (z == n)
    {
        cout << "YES" << endl;
        for (int i = 1; i <= n; i++)
        {
            if (mm[i] == (n - 1))
                cout << 'b';
            else
                cout << 'a';
        }
        return 0;
    }
    BFS(y);
    for (int i = 1; i <= n; i++)
    {
        if (b[i] == c[i])
        {
            cout << "NO";
            return 0;
        }
    }
    cout << "YES" << endl;
    for (int i = 1; i <= n; i++)
    {
        if (c[i] == 1)
            cout << 'c';
        if (b[i] == 1)
        {
            if (mm[i] == (n - 1))
                cout << 'b';
            else
                cout << 'a';
        }
    }
}

#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>
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll  long long
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define pii pair<ll,ll>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>

ll mod(ll a){
if(a>=0)
    return a;
else return -a;
}
ll ma=998244353;

ll power(ll x,ll t){
if(t<=0){
    return 1;
}
ll y=(power(x,t/2));
y=(y*y)%ma;
if(t%2)
    y=(y*x)%ma;
return y;

}
/*ll ph[100001];
void E_phi(int n){

ph[0]=0;
ph[1]=1;
for(int i=2;i<=n;i++){
    ph[i]=i;
}
for(int i=2;i<=n;i++){
    if(ph[i]==i){
        for(int j=i;j<=n;j+=){
            ph[j]-=ph[j]/i;
        }
    }
}

}*/
/*string s,t;
vector<int>  z_fun(string s){

int n = (int) s.length();
    vector<int> z(n);
    for (int i = 1, l = 0, r = 0; i < n; ++i) {
        if (i <= r)
            z[i] = min (r - i + 1, z[i - l]);
        while (i + z[i] < n && s[z[i]] == s[i + z[i]])
            ++z[i];
        if (i + z[i] - 1 > r)
            l = i, r = i + z[i] - 1;
    }
    return z;
}*/

/*struct st{
ll sum,pre,suf,ans;
st(){}
st(ll k){
ans=k,pre=k,suf=k,sum=0;
}

};
ll t[4*200001+4];
ll a[200001];
ll lazy[4*200001+4];
ll mx=1e14;

void push(int ind){
int l=2*ind+1,r=2*ind+2;
t[l]+=lazy[ind];
t[r]+=lazy[ind];
lazy[l]+=lazy[ind];
lazy[r]+=lazy[ind];
lazy[ind]=0;

}

void build(int ind,int l,int r){
if(l==r){
    t[ind]=a[l];
return;
}
int mid=(l+r)/2;
build(2*ind+1,l,mid);
build(2*ind+2,mid+1,r);

  t[ind] =min(t[ind*2+1] , t[ind*2+2]);

}
ll query(int ind,int l,int r,int p,int q){

if(l>q || r<p )
    return mx;
    int mid=(l+r)/2;

if(l>=p && r<=q )
    {
      return t[ind];
    }
    push(ind);
ll x=query(2*ind+1,l,mid,p,q);
ll y=query(2*ind+2,mid+1,r,p,q);

return min(x,y);
}

void update(int ind,int l,int r,int p,int q,int val){
if(l>q || r<p )
    return;

if(l>=p && r<=q )
    {
      t[ind]+=val;
      lazy[ind]+=val;
      return;
    }
push(ind);
int mid=(l+r)/2;
    update(2*ind+1,l,mid,p,q,val);
     update(2*ind+2,mid+1,r,p,q,val);
    t[ind]=min(t[2*ind+1],t[2*ind+2]);

}
*/

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

   int n,m;
   cin>>n>>m;
   vector<vector<int> >g(n+1);
   vector<int> si(n);
   for(int i=0;i<m;i++){
    int x,y;
    cin>>x>>y;
    g[x].pb(y);
    g[y].pb(x);
    si[x-1]++;
    si[y-1]++;
   }

   int c1=0;
   map<int,int> f;
   char ans[n];
   for(int i=0;i<n;i++){
    if(si[i]==n-1)
        c1++,ans[i]='b';
    else f[si[i]]++;
   }
   if(f.size()>2)
   {

       cout<<"No"<<endl;
       return 0;
   }
   int p=0;
   {
   for(auto x:f){

    if(x.ff+1==x.ss+c1){
            for(int i=0;i<n;i++){
                if(si[i]==x.ff){
                    if(p==0){
                        ans[i]='a';
                    }
                    else ans[i]='c';

                }
            }
       p++;

    }
    else if(f.size()==1 && x.ss%2==0 && x.ff+1==x.ss/2+c1){
            int s1=x.ss/2;
        for(int i=0;i<n;i++){
            if(si[i]==x.ff){
                if(s1>0){
                        si[i]=-1;
                    ans[i]='a';
                    for(auto y:g[i+1])
                    {
                        ans[y-1]='a';
                        si[y-1]=-1;
                    }

                    s1=0;
                }
                else {
                        ans[i]='c';
                        si[i]=-1;
                    for(auto y:g[i+1])
                    {
                        ans[y-1]='c';
                        si[y-1]=-1;
                    }
                }
            }
        }

    }
    else{
        cout<<"No"<<endl;
        return 0;
    }

   }

   }

   cout<<"Yes"<<endl;

   for(int i=0;i<n;i++)
    cout<<ans[i];
   cout<<endl;

}

/*************************************************************************
    > File Name: C.cpp
************************************************************************/
#include <cstdio>
#include <iostream>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
#define per(i,a,n) for(int i=n-1;i>=a;--i)
#define rep(i,a,n) for(int i=a;i<n;++i)
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef vector<int> VI;
typedef pair<int, int> PII;
#define lc(o) (o<<1)
#define rc(o) (o<<1|1)
ll powmod(ll a,ll b, ll MOD) {ll res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;}
/*----------- head-----------*/
const int maxn = 500 + 10;
int n, m;
vector<int> tv;
int c[maxn], vis[maxn];
vector<int> G[maxn];

bool dfs(int u, int f) {
    if (vis[u]) {
        if (c[u] == 3-f)
            return false;
        if (c[u] == f) return true;
    }
    c[u] = f; vis[u] = true;
    rep(i, 0, G[u].size()) {
        if (!dfs(G[u][i], 3-f)) return false;
    }
    return true;
}

int main() {
    //freopen("C.txt", "r", stdin);
    scanf("%d%d\n", &n, &m);
    rep(i, 0, m) {
        int d1, d2; scanf("%d%d\n", &d1, &d2);
        G[d1].pb(d2); G[d2].pb(d1);
    }

    rep(i, 1, n+1) {
        vector<int>& v = G[i];
        sort(all(v));
        tv.clear(); int p = 0;
        rep(j, 1, n+1) {
            if (j == i) continue;
            if (v.empty() || p>=v.size() || v[p]!=j)
                tv.pb(j);
            else ++p;
        }
        v = tv;
    }

    rep(i, 1, n+1) if (G[i].size() == n-1) { c[i]=3; vis[i]=true;}

    bool ok = true;
    rep(i, 1, n+1) {
        if (!vis[i]) {
            if (!dfs(i, 1)) {
                ok = false; break;
            }
        }
    }

    //int acnt = 0, ccnt = 0;
    //rep(i, 1, n+1) {
    //    if (acnt == 0 && c[i] == 1) acnt = G[i].size();
    //    if (ccnt == 0 && c[i] == 2) ccnt = G[i].size();
    //    if (c[i] == 1 && G[i].size() != acnt) { ok = false; break;}
    //    if (c[i] == 2 && G[i].size() != ccnt) { ok = false; break;}
    //}

    if (!ok) { printf("NO\n"); return 0;}
    printf("YES\n");
    rep(i, 1, n+1) {
        if (c[i] == 0) printf("b");
        if (c[i] == 1) printf("a");
        if (c[i] == 2) printf("c");
    }
    printf("\n");
}

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
    char st;
    int n,m,i,x,y,c,d,flag;
    while(scanf("%d%d",&n,&m)!=EOF){
        flag=0;
        st='a';
        for(i=0;i<m;i++){
            scanf("%d%d",&x,&y);
            c=max(x,y);
            d=min(x,y);
            if(flag==1)
                continue;
            if(c-d>1)
                flag=1;
        }
        if(n==1||flag==1)
            printf("No\n");
        else if(flag==0){
            printf("Yes\n");
            for(i=0;i<n;i++)
                printf("%c",st);
            printf("\n");
        }
    }
    return 0;
}

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

const int maxn=505;

int n,m,cnt,map[maxn][maxn],col[maxn];
bool flag;
vector<int>f[maxn];

void dfs(int x,int color){
	col[x]=color;
	for(int i=0;i<f[x].size();i++){
		int v=f[x][i];
		if(col[v]==col[x]){
			flag=1;
			return;
		}
		if(!col[x])dfs(x,-color);
	}
}

int main(){
	cin>>n>>m;
	int u,v;
	for(int i=1;i<=m;i++){
	    	cin>>u>>v;
	    	map[u][v]=map[v][u]=1;
		}
	for(int i=1;i<=n;i++)
	    for(int j=i+1;j<=n;j++)
	        if(!map[i][j]){
	        	cnt++;
	        	f[i].push_back(j);
	        	f[j].push_back(i);
			}
	if(!cnt){
		cout<<"Yes"<<endl;
		for(int i=1;i<=n;i++)
		    cout<<"b";
		cout<<endl;
		return 0;
	}
	for(int i=1;i<=n;i++)
	    if(!col[i]){
	    	flag=0;
	    	dfs(i,1);
	    	if(flag){
	    		cout<<"No"<<endl;
	    		return 0;
			}
		}
	for(int i=1;i<=n;i++){
		if(col[i]==1)cout<<"a";
		if(col[i]==-1)cout<<"c";
		if(col[i]==0)cout<<"b";
	}
	return 0;
}

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

const int MAXN = 505;

int n,m;
bool mat[MAXN][MAXN];
char ans[MAXN];

void solve(int i, int j){
	ans[i] = 'a';
	ans[j] = 'c';

	for (int l = 1; l <= n; l++){
		if (l != i and l != j){

			if (mat[i][l] and mat[j][l]){
				ans[l] = 'b';

			}else if (mat[i][l]){
				ans[l] = 'a';

			}else if (mat[j][l]){
				ans[l] = 'c';

			}else {
				cout << "No";
				return;
			}
		}
	}
	cout << "Yes" << endl;
	for (int l = 1; l <= n; l++)
		printf("%c",ans[l]);
	cout << endl;
	return;
}

int main(){

	cin >> n >> m;
	for (int i = 0; i < m; i++){
		int a,b;
		scanf ("%d %d", &a, &b);
		mat[a][b] = 1;
		mat[b][a] = 1;
	}

	if (m == (n*(n-1))/2){
		cout << "Yes" << endl;
		for (int i = 1; i <= n; i++)
			cout << "b";
			return 0;
	}

	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= n; j++){
			if (i != j){
				if (!mat[i][j]){
					solve(i,j);
					return 0;
				}
			}
		}
	}

	return 0;
}

//amankumar
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
 using namespace std;
#define int          unsigned long long int
#define mp           map<int,int>
#define pb           push_back
#define pob          pop_back
#define pr           pair<int,int>
#define all(a)       a.begin(),a.end()
#define allr(a)      a.rbegin(),a.rend()
#define F            first
#define S            second
#define mst          multiset<int,int>
#define rep(i,a,b)   for(int i=a;i<b;i++)
#define pii          pair<int,int>
#define endl         "\n"
#define mp           map<int,int>
void optimise(){ios_base::sync_with_stdio(false);cin.tie(NULL);}
int mod=1e9+7;
void normalize(int &a){a=(a+mod)%mod;}
int modmul(int a,int b){a=a%mod;b=b%mod;normalize(a);normalize(b);return (a*b)%mod;}
int modadd(int a,int b){a=a%mod;b=b%mod;normalize(a);normalize(b);return (a+b)%mod;}
int modsub(int a,int b){a=a%mod;b=b%mod;normalize(a);normalize(b);return (a-b+mod)%mod;}
int me(int x,int n){x%=mod;if(n==0)return 1;int u=me(x,n/2)%mod;u=(u*u)%mod;if(n%2)u=(u*x)%mod;return u;}
int me1(int x,int n){if(n==0)return 1;int u=me1(x,n/2);u=u*u;if(n%2)u=u*x;return u;}
inline  int fact(int r){ int ans=1;while(r)ans=modmul(ans,r),r--;return ans; }
inline  int modInv(int a) { return me(a, mod-2); }
inline  int modDiv(int a,int b) { return modmul(a, modInv(b)); }

int __gcd(int a,int b)
{
  if(b==0)
    return a;
  else return __gcd(b,a%b);

}
const int N=5e5+1;
vector<int>vis(N);
vector<int>G[N];
vector<int>vis1(N);
void dfs(int v)
{
    vis[v]=1;
    for(auto y:G[v])
        if(vis[y]==0)
            dfs(y);

}

void solve()
{

  int n,m;
  cin>>n>>m;

  vector<int>v1(n+1);
  for(int i=0;i<m;i++)
  {
      int x1,x2;
      cin>>x1>>x2;
      G[x1].pb(x2);
      G[x2].pb(x1);
      v1[x1]++;
      v1[x2]++;

  }

  vector<int>a(n+1);

  for(int i=1;i<=n;i++)
    {
      if(v1[i]==n-1)
      {
        a[i]=2;
      }

    }

     int f=2;
    for(int i=1;i<=n;i++)
    {
      if(a[i]==0)
      {
        f++;
        if(f>4)
          {cout<<"No";return;}

        a[i]=f;

        if(!G[i].empty())

        {
          for(auto y:G[i])
        {
          if(a[y]==0)
            a[y]=f;

        }

      }

    }

}

int a1=0;
int c1=0;
int b1=0;

    for(int i=1;i<=n;i++)
    {
      if(a[i]==3)
        a1++;
      else if(a[i]==2)
       b1++;
      else
        c1++;

    }

    int k=b1*(b1-1)/2+c1*(c1-1)/2+a1*(a1-1)/2+b1*(a1+c1);

    if(m!=k)
      {cout<<"No";
    return;}

    cout<<"Yes"<<endl;

    for(int i=1;i<=n;i++)
    {
      if(a[i]==3)
        cout<<"a";
      else if(a[i]==2)
        cout<<"b";
      else
        cout<<"c";

    }

  }

signed main()
{
     optimise();
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    freopen("error.txt","w", stderr);
    #endif
    int t ;
    t=1;

   while(t--)

    { solve();
        cout<<endl;
    }

}

#include <bits/stdc++.h>
using namespace std ;
typedef vector<int> VI;
typedef long double LD;
typedef long long int LLI;
typedef pair <int, int> PII;
typedef pair <LLI, LLI> PLLILLI;
#define F first
#define S second
#define endl '\n'
#define MP make_pair
#define PB push_back
#define ALL(x) x.begin(), x.end()
#define FOR(i,start,stop) for (int i = start, _stop = stop; i <= _stop; i++)
#define ROF(i,start,stop) for (int i = start, _stop = stop; i >= _stop; i--)
#define TR(it,container) for ( __typeof (container.begin()) it = container.begin(); it != container.end(); it++)
#ifdef ONLINE_JUDGE
    #define IN_OUT
    #define FAST ios::sync_with_stdio (false); cin.tie(NULL)
    #define TESTCASES
    #define WAIT
    #define dbg(...)
    #define PVV(arr,n)
    #define PA(arr,n)
    #define PAA(arr,n,m)
#else
    #include "DEBUG.txt"
    string F_N = (string)__FILE__;
    #define IN_OUT freopen(("in" + F_N.substr(F_N.length() - 5, 1) + ".txt").c_str(), "r", stdin); freopen("out.txt", "w", stdout)
#endif
//--------------------------------------------------------------------------------------------------------------------------------
const int N = 500;
int n, m;
bool e[N + 1][N + 1];
char s[N + 1];
bool visited[2][N + 1];

void solve()
{
    s[n] = '\0';
    FOR (i, 0, n - 1)
    {
        FOR (j, 0, n - 1)
        {
            if (i != j)
            {
                if (e[i][j] == 0)
                {
                    if (visited[0][i])
                    {
                        if (visited[0][j])
                        {
                            cout << "No" << endl;
                            return;
                        }
                        else
                        {
                            visited[1][j] = true;
                        }
                    }
                    else if (visited[1][i])
                    {
                        if (visited[1][j])
                        {
                            cout << "No" << endl;
                            return;
                        }
                        else
                        {
                            visited[0][j] = true;
                        }
                    }
                    else if (visited[0][j])
                    {
                        if (visited[0][i])
                        {
                            cout << "No" << endl;
                            return;
                        }
                        else
                        {
                            visited[1][i] = true;
                        }
                    }
                    else if (visited[1][j])
                    {
                        if (visited[1][i])
                        {
                            cout << "No" << endl;
                            return;
                        }
                        else
                        {
                            visited[0][i] = true;
                        }
                    }
                    else
                    {
                        visited[0][i] = true;
                        visited[1][j] = true;
                    }
                }
            }
        }
    }
    FOR (i, 0, n - 1)
    {
        if (visited[0][i] && visited[1][i])
        {
            cout << "No" << endl;
            return;
        }
        if (visited[0][i] == false && visited[1][i] == false)
        {
            s[i] = 'b';
        }
        else if (visited[0][i] == true && visited[1][i] == false)
        {
            s[i] = 'a';
        }
        else
        {
            s[i] = 'c';
        }
    }
    cout << "Yes" << endl;
    cout << s << endl;
}

int main()
{
    IN_OUT;
    FAST;
    TESTCASES
    {
        fill_n(&e[0][0], (N + 1) * (N + 1), false);
        fill_n(&visited[0][0], 2 * (N + 1), false);
        cin >> n >> m;
        FOR (i, 0, m - 1)
        {
            int u, v;
            cin >> u >> v;
            u--, v--;
            e[u][v] = true;
            e[v][u] = true;
        }
        solve();
    }
    WAIT;
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
struct Node
{
	int mark=0;
	vector<int> nbr;
}ar[502];
int main() {
	// your code goes here
	int vertices,a,b,edges;
	cin>>vertices>>edges;
	int t=edges;
	int starting_a=-1;
	while(t--)
	{
		cin>>a>>b;
		ar[a].nbr.push_back(b);
		ar[b].nbr.push_back(a);
		if(ar[a].nbr.size()==(vertices-1))
		ar[a].mark=2;
		if(ar[b].nbr.size()==(vertices-1))
		ar[b].mark=2;
	}
	int flag=0;
	for(int i=1;i<=vertices;i++)
	{
		if(ar[i].mark==2)
		{
			for(int j=0;j<ar[i].nbr.size();j++)
			{
				if(ar[ar[i].nbr[j]].mark==0)
				{
					starting_a=ar[i].nbr[j];
					ar[ar[i].nbr[j]].mark=1;
					flag=1;
					break;
				}
			}

		}
		if(flag==1)
		break;
	}
	if(starting_a==-1)
	{
		cout<<"YES"<<endl;
		for(int i=1;i<=vertices;i++)
		cout<<"b";
		return 0;
	}
	else
	{
	//	cout<<ar[1].mark<<endl;
		//cout<<"starting a:"<<starting_a<<endl;
		for(int i=0;i<ar[starting_a].nbr.size();i++)
		{
			if(ar[ar[starting_a].nbr[i]].mark==0)
			{
			//	cout<<"more :a"<<ar[starting_a].nbr[i]<<endl;
				ar[ar[starting_a].nbr[i]].mark=1;
			}
		}
		int count_a=0,count_b=0,count_c=0;
		//cout<<ar[1].mark<<endl;
	for(int i=1;i<=vertices;i++)
	{
		if(ar[i].nbr.size())
			{
				if(ar[i].mark==0)
				{
					ar[i].mark=3;
					count_c++;
				}
				else if(ar[i].mark==2)
					count_b++;
				else if(ar[i].mark==1)
				{
					//cout<<"a:"<<i<<endl;
					count_a++;
				}
			}
		}
		int isvalid=1;

		for(int i=1;i<=vertices;i++)
		{
			if(ar[i].nbr.size())
				{
				if(ar[i].mark==3)
				{
					if(ar[i].nbr.size()!=count_c+count_b-1)
					{
						//cout<<"error occured here :";
						isvalid=0;
						break;
					}
				}
				else if(ar[i].mark==2)
				{
					if(ar[i].nbr.size()!=count_a+count_b+count_c-1)
					{
					//	cout<<"error occured here :";
						isvalid=0;
						break;
					}
				}
				else
				{
					if(ar[i].nbr.size()!=count_a+count_b-1)
					{
						// cout<<ar[i].mark<<" "<<i<<endl;
						// cout<<ar[i].nbr.size()<<" "<<count_a<<" "<<count_b<<endl;
						// cout<<"error occured here :";
						isvalid=0;
						break;
					}
				}
			}
		}
		if(!isvalid)
		{
			cout<<"NO";return 0;
		}
		else
		{
			for(int i=1;i<=vertices;i++)
			{
				if(ar[i].mark)
				cout<<(char)('a'+ar[i].mark-1);
			}
			return 0;

		}

	}
	return 0;
}

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <vector>
#include<cctype>
#include<algorithm>
#include<set>
#include<stack>
#include<map>
#include<stdlib.h>
#include<ctime>
#include<iterator>
#include <deque>
#include <sstream>
#include<queue>
#include<cstdlib>
#include<bitset>

#define fn(i,n) for(int (i) = 0;(i) < (n);(i)++)
#define f1n(i,n) for(int (i) = 1;(i) <= (n);(i)++)
#define mk(f,s) make_pair((f),(s))

#define defV(dp,e) memset(dp,e,sizeof dp)

#define ri(n) scanf("%d",&n)
#define rl(n) scanf("%lld",&n)
#define rs(s) scanf("%s",s)

#define PI acos(1.0)

using namespace std;

typedef long long ll;
typedef pair<int ,int > pp;

typedef vector<int  > v1;
typedef vector<ll  > vl;
typedef vector<pp  > vpp;
typedef vector<bool  > vb;
typedef vector<char > vc;
typedef vector<v1 > v2;

typedef map<int ,int > mf;
typedef map<int ,vpp > mv;
typedef map<int ,v1 > ad;

int const siz = 1e9,bound = 1e5,mod = siz+7;
ll const cnt=1e18;

v2 adj;
int n,m;

char ee[501];
int main() {
//	freopen("o.txt","w",stdout);
//	freopen("in.txt","r",stdin);
//	ios::sync_with_stdio(0);
	fn(i,501)ee[i]='-';
	ri(n),ri(m);
	adj=v2(n+1);
	int bs=0,as=0,cs=0;
	fn(i,m){
		int a,b;
		ri(a),ri(b);
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	f1n(i,n)
		if(adj[i].size()==n-1){
			ee[i]='b';
			bs++;
		}

	f1n(i,n){
		if(ee[i]=='-'){
			ee[i]='a';
			as=adj[i].size()+1;
			fn(j,adj[i].size()){
				int u=adj[i][j];
				if(ee[u]=='-')
					ee[u]='a';
			}
			break;
		}
	}

	f1n(i,n){
		if(ee[i]=='-'){
			ee[i]='c';
			cs=adj[i].size()+1;
			fn(j,adj[i].size()){
				int u=adj[i][j];
				if(ee[u]=='-')
					ee[u]='c';
				else if(ee[u]=='a'){
					puts("No");
					return 0;
				}
			}
			break;
		}
	}

	string ans;
	f1n(i,n){
		if(ee[i]=='-'){
			puts("No");
			return 0;
		}else{
			if(ee[i]=='a'){
				if(adj[i].size()!=as+bs-1){
					puts("No");
					return 0;
				}
			}else if(ee[i]=='c'){
				if(adj[i].size()!=cs+bs-1){
					puts("No");
					return 0;
				}
			}
			ans+=ee[i];
		}
	}
	printf("Yes\n%s\n",ans.c_str());
	return 0;
}

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

const int maxn=505;
const int maxm=200005;

int n,m,d[maxn],col[maxn],line[maxn][maxn];
bool flag,vis[maxn];
vector<int>f[maxn];

void dfs(int u,int color){
	col[u]=color;
	for(int i=0;i<f[u].size();i++){
		int v=f[u][i];
		if(col[v]==col[u]){
			cout<<"No"<<endl;
			flag=1;
			exit(0);
		}
		if(!col[v])
		    dfs(v,-color);
	}
}

int main(){
	cin>>n>>m;
	int u,v;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		line[u][v]=1;
		line[v][u]=1;
	}
	for(int i=1;i<=n;i++)
	    for(int j=i+1;j<=n;j++)
	        if(!line[i][j]){
	        	d[i]++;d[j]++;
	        	f[i].push_back(j);
	        	f[j].push_back(i);
			}
	for(int i=1;i<=n;i++)
	    if(!vis[i]&&d[i]){
	    	dfs(i,1);
	    	if(flag)return 0;
		}
	for(int i=1;i<=n;++i)
	    for(int j=i+1;j<=n;j++)
            if(line[i][j]&&col[i]+col[j]==0&&col[i]!=0){
            	cout<<"No"<<endl;
                return 0;
			}
	cout<<"Yes"<<endl;
	for(int i=1;i<=n;i++){
		if(col[i]==0)cout<<"b";
		if(col[i]==-1)cout<<"a";
		if(col[i]==1)cout<<"c";
	}
	cout<<endl;
	return 0;
}

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <cmath>
#include <iostream>
#include <set>
#include <fstream>
#include <string>
#include <vector>
#include <bits/stdc++.h>

using namespace std;
#define FOR(i,s,e) for (int i=(s); i<(e); i++)
#define FOE(i,s,e) for (int i=(s); i<=(e); i++)
#define FOD(i,s,e) for (int i=(s); i>=(e); i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define debug(args...) {vector<string> _v = split(#args, ','); err(_v.begin(), args); puts("");}
#define LL long long
#define ULL unsigned long long
#define eps 1e-9
#define pi acos(-1.0)
#define df(s) {freopen("s.in", "r", stdin); freopen("s.out", "w", stdout);}
LL max(LL a,LL b){if (a>b){return a;} else {return b;}}
LL min(LL a,LL b){if (a<b){return a;} else {return b;}}

vector<string> split(const string& s, char c) {
	vector<string> v;
	stringstream ss(s);
	string x;
	while (getline(ss, x, c))
		v.emplace_back(x);
	return move(v);
}

void err(vector<string>::iterator it) {}
template<typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
	cerr << it -> substr((*it)[0] == ' ', it -> length()) << " = " << a << ", ";
	err(++it, args...);
}

template<typename T>
struct number_iterator : std::iterator<random_access_iterator_tag, T>{
	T v;
	number_iterator(T _v) : v(_v) {}
	operator T&(){return v;}
	T operator *() const {return v;}
};
template <typename T>
struct number_range {
	T b,e;
	number_range(T b, T e):b(b),e(e){}
	number_iterator<T> begin(){return b;}
	number_iterator<T> end(){return e;}
};

template<typename T> number_range<T> range(T e) {return number_range<T>(1, e + 1);}

template<typename T> number_range<T> range(T b, T e) {return number_range<T>(b, e + 1);}

int n, m, a[601][601], co[601], de[601], die;

void DFS(int u, int cp){
	co[u] = cp;
	FOE(j, 1, n) if (a[u][j]){
		if (co[j] == 0) DFS(j, 4 - cp);
		else if (co[j] != 4 - cp) { die = 1;}
	}
}

int main(){
	scanf("%d%d", &n, &m);
	FOE(i, 1, n) de[i] = n - 1;
	FOE(i, 1, n) FOE(j, 1, n) a[i][j] = 1;
	FOE(i, 1, n) a[i][i] = 0;
	FOE(i, 1, m){
		int c, d; scanf("%d%d", &c, &d);
		a[c][d] = a[d][c] = 0;
		de[c]--; de[d]--;
	}

	FOE(i, 1, n) if (!co[i] && de[i] >= 1) DFS(i, 1);
	FOE(i, 1, n) FOE(j, 1, n) if (a[i][j]){
		if (co[i] != co[j]) die = 1;
		FOE(k, 1, n) if (a[i][k]&&a[k][j]&&de[k]>=1) die = 1;
	} else if (co[i] != 0 && co[j] != 0 && co[i] != co[j]) die = 1;
	if (die) puts("No");
	else {
		puts("Yes");
		FOE(i, 1, n)
			if (co[i] == 1) printf("a");
			else if (co[i] == 0) printf("b");
			else printf("c");
		puts("");
	}

    return 0;
}

#include<bits/stdc++.h>

#define NN 555

using namespace std;

int adj[NN][NN];

char ans[NN];

int main(){

	int n,m,u,v,i,j;

	cin>>n>>m;

	for(i=0; i<m; i++){

		scanf("%d%d", &u, &v);

		adj[u][v]=adj[v][u]=1;

	}

	for(i=1; i<=n; i++){

		for(j=1; j<=n; j++){

			if(i==j || adj[i][j]) continue;

			if((ans[i] || ans[j])&& ans[i]==ans[j]) {  puts("No"); return 0;}

			if(ans[i] && ans[j]==0) {ans[j]='a'+'c'-ans[i]; continue;}

			if(ans[i]==0 && ans[j]) {ans[i]='a'+'c'-ans[j]; continue;}

			if(ans[i] && ans[j] && ans[i]==ans[j]) continue;

			ans[i]='a'; ans[j]='c';

		}

	}

	for(i=1; i<=n;i++) ans[i]=(ans[i]==0)?'b':ans[i];

	for(i=1; i<=n; i++) {

		for(j=1; j<=n; j++){

			if(i==j) continue;

			if(adj[i][j] && (ans[i]*ans[j]=='a'*'c') ) { puts("No"); return 0;}

			if(!adj[i][j] && (abs(ans[i]-ans[j])<2)) {puts("No"); return 0;}

		}

	}

	puts("Yes");

	puts(ans+1);

	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 <iostream>

#define fi first
#define se second
#define pb(x) push_back(x)
#define sqr(x) ((x)*(x))
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
#define cs(x) printf("Case %d: ", x)

using namespace std;
template <class T> inline void umax(T &x,T y) {if (y > x) x = y;}
template <class T> inline void umin(T &x,T y) {if (y < x) x = y;}
typedef long long ll;
typedef pair <int, int> pii;

const int N = 5e2 + 5, B = 0x7fffffff;
int cnt[N], col[N];
char ans[] = {' ', 'a', 'b', 'c'};
bool adj[N][N], res = 1;
int n, m;

int main(){
  cin >> n >> m;
  for (int i = 1, x, y; i <= m; i++){
    cin >> x >> y;
    cnt[x]++, cnt[y]++;
    adj[x][y] = adj[y][x] = 1;
  }
  for (int i = 1; i <= n; i++){
    if (cnt[i] == n - 1) col[i] = 2;
  }
  for (int i = 1; i <= n; i++){
    if (col[i] == 0){
      col[i] = 1;
      for (int j = 1; j <= n; j++){
        if (col[j] != 0) continue;
        if (adj[i][j] == 1) col[j] = 1;
        else col[j] = 3;
      }
    }
  }
  for (int i = 1; i <= n; i++){
    for (int j = 1; j <= n; j++){
      if (i == j) continue;
      if ((col[i] == 1 && col[j] == 3) || (col[i] == 3 && col[j] == 1))
        if (adj[i][j] == 0) res = 0;
    }
  }
  if (res) {cout << "Yes\n"; for (int i = 1; i <= n; i++) cout << ans[col[i]];}
  else puts("No");

  return !1;
}

#include <stdio.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <cstring>
#include <vector>
#include <math.h>
#include <queue>
#include <map>
#include <algorithm>
#define N 1000005
#define INF 1e19

#define C(x) memset(x, 0, sizeof(x))
#define FOR(i,n,m) for(int i=n; i<=m; i++)
#define FORD(i,n,m) for(int i=n; i>=m; i--)
#define REP(i,n) for(int i=0; i<n;i++)

using namespace std;

typedef long long ll;
void gt(int &a, int b){ if (a < b) a = b; }
void sm(int &a, int b){ if (a > b) a = b; }
string n2s(int a){ stringstream ss; ss << a; return ss.str(); }
typedef pair<int, int> pi;
typedef vector<int> vi;
string getKey(int v, int h){ return n2s(v)+ "-" + n2s(h);}
/**
 Use cases && constrains
    pain a[i] with 1 or 0

    dfs for not connected graph,
        if a[i] == 0 dfs(i)

    for each a[i] print result 1 ->a, 2 -> c
 */

int a[600]{0}, g[600][600]{0}, n, m;

bool dfs(int u) {
    FOR(v, 1, n) if(u != v && g[u][v] == 0) {
        if (a[v] == 0) {
            a[v] = 3 - a[u];
            if (!dfs(v)) return false;
        } else {
            if (a[v] != 2 - a[u]) return false;
        }
    }
    return true;
}

int main() {
//    freopen("/Users/tomhoang/Documents/tom/algo/input.txt", "rt", stdin);
    int m, u, v;

    cin >> n >> m;
    while (m--) {
        cin >> u >> v;
        g[u][v] = 1;
        g[v][u] = 1;
    }

    FOR(i, 1, n) if (a[i] == 0) {
        a[i] = 1;
        if (!dfs(i)) {
            cout << "NO";
            return 0;
        }
    }

    cout << "YES" << endl;
    REP(i, n) cout << (a[i] == 1 ? 'a' : 'c');
    return 0;
}

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

char c[100000]={0};
bool bl[100000]={0};
int num[100000]={0};
int nm[1000]={0};
vector <int> a[1000];
int cnt=0;
void dfs(int x, int col){
    num[nm[x]]=col;
    bl[nm[x]]=1;
    cnt=max(cnt, col);
    int tmp=col+1;
    for(int i=x; i<a[x].size(); ++i){
        int j=a[x][i];
        if(!bl[nm[j]]){
            dfs(j, col+1);
        }
    }
}

bool q[1000][1000]={0};

int main()
{
    int n, m, x, y;
    cin>>n>>m;
        for(int i=0; i<m; ++i){
            cin>>x>>y;
            q[x][y]=q[y][x]=1;
            q[x][x]=q[y][y]=1;
            a[x].push_back(y);
            a[y].push_back(x);
        }
        memset(nm, -1, sizeof nm);
        int res=0;
        for(int i=1; i<=n; ++i){
            if(nm[i]!=-1)
                continue;
            nm[i]=i;
            ++res;
            for(int k=0; k<a[i].size(); ++k){
                int j=a[i][k];
                if(a[i].size()==a[j].size()){
                    bool l=1;
                    for(int z=0; z<a[i].size(); ++z){
                        if(!q[j][a[i][z]]){
                            l=0;
                            break;
                        }
                    }
                    if(l){
                        //b[i][j]=1;
                        nm[j]=i;
                    }
                }
            }
        }
        bool f_ans=1;
        int zen[1000]={0};
        num[1]=0;
        bl[1]=1;
        for(int i=1; i<=n; ++i){
            bool l[1000]={0};
            int tmp=0;
            for(int j=0; j<a[i].size(); ++j){
                if(!l[nm[a[i][j]]]){
                    ++tmp;
                    l[nm[a[i][j]]]=1;
                }
            }
            if(tmp>2){
                f_ans=0;
                break;
            }
            zen[i]=tmp;
        }
        if(!f_ans){
            cout<<"NO"<<endl;
        }
        else{
            for(int i=1; i<=n; ++i){
                if(zen[i]<=1&&bl[nm[i]]==0){
                    dfs(i, cnt+2);
                   // break;
                }
            }
            if(cnt>26){
                cout<<"NO"<<endl;
            }
            else{
                cout<<"YES"<<endl;
                for(int i=1; i<=n; ++i){
                    cout<<(char(num[nm[i]]+'a'));
                }
            }
        }
    return 0;
}
/*
12 16
1 2
1 3
2 3
3 4
4 5
4 6
5 6
6 7
6 8
7 8
9 10
8 9
8 10
10 11
11 12
10 12
*/

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

template <class T> T sqr(T x)
{
    return x*x;
}
int n,m;
int A[501][501];
int deg[501];
int* color;

int bfs(int now, int c)
{
    vector<pair<int, int> > Q;
    pair<int, int> pp = {now, c};
    Q.push_back(pp);
    int pos = 0;
    int ret = 0;
    while(pos<Q.size() && ret == 0)
    {
        pp = Q[pos];
        now = pp.first;
        c = pp.second;
        color[now] = c;
        for(int j=1; j<=n; j++)
            if (now!=j && A[now][j]==0 && color[j]==c)
                ret = 1;//coloring conflict

        for(int j=1; j<=n; j++)
            if (A[now][j]==1 && abs(color[j]-c)>1)
                ret = 1;//coloring conflict

        for(int j=1; j<=n; j++)
            if (A[now][j]==0 && color[j]==-1)
            {
                color[j] = 2-c;
                pair<int, int> q = {j, 2-c};
                Q.push_back(q);
            }
        pos++;
    }
    if (ret)
        for(int i=0; i<Q.size(); i++)
            color[i] = -1;
    return ret;
}

int main()
{
    //freopen("d:\\src\\CppProjects\\stdin","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=0; i<m; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        A[u][v] = 1;
        A[v][u] = 1;
        deg[u]++;
        deg[v]++;
    }

    color = new int[n+1];
    for(int i=1; i<=n; i++)
        color[i] = -1;

    int ret;
    for(int i=1; i<=n; i++)
    {
        ret = 0;
        if (color[i]==-1 && deg[i] == n-1)
            color[i] = 1;
        if (color[i]==-1 && deg[i] != n-1)
        {
            ret = bfs(i,0);
            if (ret)
                ret = bfs(i,2);
        }
        if (ret)
        {
            printf("No");
            return 0;
        }
    }

    printf("Yes\n");
    for(int i=1; i<=n; i++)
        printf("%c",color[i]+'a');

    return 0;
}

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
#include <cstdio>
#include <stdlib.h>
#include <stack>
#include <numeric>
#include <bitset>
#include <cctype>
#include <list>
#include <assert.h>
#include <random>
#include <unordered_map>
#include <ctime>
typedef long long ll;
using namespace std;
#define INF 2147483647
#define infL (1LL<<60)
#define inf (1<<30)
#define inf9 (1000000000)
#define MOD 1000000007
#define EPS 1e-9
#define Gr 9.8
#define PI acos(-1)
#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define REQ(i,n) for(int (i)=1;(i)<=(int)(n);(i)++)
#define lch (rt<<1)
#define rch (rt<<1|1)
#define MAX 505
typedef pair<int, int> pii;
typedef long double ld;
typedef unsigned int uint;
bool debug = 0;
int n,m,k;
int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0};
string direc="RDLU";
ll ln, lk, lm;

bool a[MAX][MAX];
vector<int> mp[MAX];
int ans[MAX];
void dfs(int x, int pa, int col) {
    ans[x] = col;
    for(int c:mp[x]) if(c!=pa) {
        int tar = 4-col;
        if (ans[c] == 0) dfs(c,x,tar);
        else if (ans[c] != tar) {
            puts("No"); exit(0);
        }
    }
}
void fmain() {
    scanf("%d%d", &n, &m);
    for(int i=0,u,v;i<m;i++) {
        scanf("%d%d", &u, &v); a[u][v]=a[v][u]=1;
    }
    REQ(i,n) REQ(j,n) if (a[i][j]==0 && i!=j) {
        mp[i].push_back(j); mp[j].push_back(i);
    }
    REQ(i,n) if (!mp[i].empty() && ans[i]==0) {
        dfs(i,-1,1);
    }
    REQ(i,n) {
        if (ans[i]==1) printf("a");
        else if (ans[i]==3) printf("c");
        else printf("b");
    }
}
int main() {
    fmain();
    return 0;
}

#include <iostream>
using namespace std;
#include <vector>
vector<int>G[600];
bool vis[600];
bool M[600][600];
char letter[1000];
void dfs(int u){
	if(letter[u]!='x')return;
	letter[u]='a';
	for(int v:G[u])dfs(v);
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=0;i<=n;i++)letter[i]='x';
	for(int i=0,u,v;i<m;i++){
		cin>>u>>v;
		G[u].push_back(v);G[v].push_back(u);
		M[u][v]=M[v][u]=true;
	}
	for(int i=1;i<=n;i++){
		if(G[i].size()>2)letter[i]='b';
	}
	for(int i=1;i<=n;i++){
		if(letter[i]=='x'){
			dfs(i);
			break;
		}
	}
	for(int i=1;i<=n;i++){
		if(letter[i]=='x'){
			letter[i]='c';
		}
	}
	//for(int i=1;i<=n;i++)cout<<letter[i];
	int a=0,b=0,c=0;
	for(int i=1;i<=n;i++){
		if(letter[i]=='a'){
			a++;
			for(int j=1;j<=n;j++){
				if(i==j)continue;
				if(letter[j]=='c'&&M[i][j])return cout<<"No",0;
				if(letter[j]!='c')if(!M[i][j])return cout<<"No",0;
			}
		}
		if(letter[i]=='b'){
			b++;
			for(int j=1;j<=n;j++){
				if(i==j)continue;
				if(!M[i][j])return cout<<"No",0;
			}
		}
		if(letter[i]=='c'){
			c++;
			for(int j=1;j<=n;j++){
				if(i==j)continue;
				if(letter[j]=='a'&&M[i][j])return cout<<"No",0;
				if(letter[j]!='a')if(!M[i][j])return cout<<"No",0;
			}
		}
	}
	string ans="";
	string A(a,'a'),B(b,'b'),C(c,'c');
	ans+=A;ans+=B;ans+=C;
	cout<<"Yes\n"<<ans;
}

#include<iostream>
#include<fstream>
#include<algorithm>
#include<math.h>
#include<vector>
#include<string>
#include<utility>
#include<map>
#include<sstream>
#include<cctype>
#include<queue>
#include<set>
#include<cstdio>
using namespace std;

bool v[501][501];
int abc[3][501];
int n;
string abbc;
bool fun(int r, int a, int b, int c,string s)
{
	if(r==n+1)
	{
		abbc =s;
		return 1;
	}
	bool ch[3];
	ch[0]=ch[1]=ch[2]=0;
	for(int i=0;i<a;i++)
		if(v[r][abc[0][i]]==0)
			{ch[0]=0;break;}
		else
			ch[0]=1;
	for(int i=0;i<b;i++)
		if(v[r][abc[1][i]]==0)
			{ch[1]=0;break;}
		else
			ch[1]=1;
	for(int i=0;i<c;i++)
		if(v[r][abc[2][i]]==0)
			{ch[2]=0;break;}
		else
			ch[2]=1;

	if((ch[0]&&ch[1]&&ch[2])||(ch[0]&&!b)||(ch[2]&&!b))
		{
			bool b1;
			abc[1][b]=r;
			b1 = fun(r+1,a,b+1,c,s+'b');
			abc[1][b]=0;
			if(b1)return b1;
		}
	if((ch[0]&&ch[1]&& !ch[2])||(ch[1]&&!a))
	{
		bool b1;
		abc[0][a]=r;
		b1 = fun(r+1,a+1,b,c,s+'a');
		abc[0][a]=0;
		if(b1)return b1;
	}
	if((ch[1]&&ch[2]&& !ch[0])||(ch[1]&&!c))
	{
		bool b2;
		abc[2][c]=r;
		b2 = fun(r+1,a,b,c+1,s+'c');
		abc[2][c]=0;
		if(b2)return b2;
	}

	return 0;

}

int main()
{
//for(;;)
{
	int m;
	cin>>n>>m;
	int x,y;
	for(int i=0;i<m;i++)
	{
		cin>>x>>y;
		v[x][y]=1;
		v[y][x]=1;
	}
	bool br = 0;
		abc[1][0]=1;
		br = fun(2,0,1,0,"b");
		abc[1][0]=0;
		if(br)
		{
			cout<<"Yes\n"<<abbc<<endl;
			return 0;
		}
		abc[0][0]=1;
		br = fun(2,1,0,0,"a");
		abc[0][0]=0;
		if(br)
		{
			cout<<"Yes\n"<<abbc<<endl;
			return 0;
		}
		abc[2][0]=1;
		br = fun(2,0,0,1,"c");
		abc[2][0]=0;
		if(br)
		{
			cout<<"Yes\n"<<abbc<<endl;
			return 0;
		}
		cout<<"No"<<endl;
}
return 0;
}

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

typedef long long ll;

const int N = 1e6 + 100;

bool edge[505][505];
int vis[505];

int comp = 1;
int n, m;
string res;

void dfs(int u) {
    vis[u] = comp;
    for(int v = 0; v < n; v++) {
        if(vis[v] == 0 && edge[u][v] == 1) dfs(v);
    }
}

int edge_sz[505];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        edge[u][v] = edge[v][u] = 1;
        edge_sz[u]++;
        edge_sz[v]++;
    }
    res.assign(n, '*');
    int a = 0, b = 0, c = 0;
    for(int i = 0; i < n; i++) {
        if(edge_sz[i] == n-1) {
            b++;
            vis[i] = 1;
            for(int j = 0; j < n; j++) {
                if(edge[j][i]) edge[j][i] = 0, edge_sz[j]--;
            }
        }
    }

    for(int i = 0; i < n; i++) {
        if(vis[i] == 0) {
            ++comp;
            if(comp > 3) {
                cout << "No" << endl;
                return 0;
            }
            dfs(i);
        }
    }

    for(int i = 0; i < n; i++) {
        if(vis[i] == 2) a++;
        if(vis[i] == 3) c++;
    }

    for(int i = 0; i < n; i++) {
        if(vis[i] == 1) {
            res[i] = 'b';
        }
        if(vis[i] == 2) {
            if(edge_sz[i] != a-1) {
                cout << "No";
                return 0;
            }
            res[i] = 'a';
        }
        if(vis[i] == 3) {
            if(edge_sz[i] != c-1) {
                cout << "No";
                return 0;
            }
            res[i] = 'c';
        }
    }

    cout << "Yes" << endl;
    cout << res << endl;

    return 0;
}

/*

6 9
1 2
2 3
3 1
4 5
6 1
6 2
6 3
6 4
6 5

*/

#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;
int g[501][501];
int cnt[501];
int ans[501];
int main(){

	int n,m;
	scanf("%d%d", &n ,&m);
	for (int i = 1; i <= m; i++){
		int a,b;
		scanf("%d%d", &a, &b);
		g[a][b] = g[b][a] = 1;
		cnt[a]++;
		cnt[b]++;
	}
	for (int i = 1; i <= n; i++){
		if (cnt[i] == n-1) ans[i] = 2;
	}
	bool flag = false;
	int starta = 0, startc = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++){
			if (i == j) continue;
			if (g[i][j] == 0){
				starta = i;
				startc = j;
				flag = true;
				break;
			}
			if (flag) break;
		}
	for (int i = 1; i <= n; i++){
		if (g[starta][i] == 1 && ans[i] != 2) ans[i] = 1;
	}
	flag = false;
	for (int i = 1; i <= n; i++){
		if (g[startc][i] == 1){
			if (ans[i] == 2) continue;
			if (ans[i] == 1){
				flag = true;
				break;
			}
			ans[i] = 3;
		}
	}
	for (int i = 1; i <= n; i++)
		if (ans[i] == 0) flag = true;
	puts(flag?"No":"Yes");
	return 0;
}

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

const int N=500+10;
int n,m,flag,D[N],ans[N],mp[N][N];

inline void In(int &x) {
	x=0;int f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';) {if(ch=='-') f=-1;ch=getchar();}
	for(;ch>='0'&&ch<='9';) x=x*10+ch-'0',ch=getchar();x*=f;
}

int main() {
	int u,v,st;
	for(;~scanf("%d%d",&n,&m);) {
		memset(D,0,sizeof D),st=flag=0;
		memset(mp,0,sizeof mp);
		memset(ans,0,sizeof ans);
		for(;m--;) In(u),In(v),mp[u][v]=mp[v][u]=1,++D[u],++D[v];
		for(int i=1;i<=n;++i)
			if(D[i]==n-1) ans[i]=2;
			else if(!st) st=i;
		if(!st) goto end;ans[st]=1;
		for(int i=1;i<=n;++i)
			if(!ans[i]) if(mp[st][i]) ans[i]=1; else ans[i]=3;
		for(int i=1;i<=n&&flag;++i)
			for(int j=i+1;j<=n;++j)
				if(abs(ans[i]-ans[j])<=1&&!mp[i][j]||abs(ans[i]-ans[j])==2&&mp[i][j])
					{flag=1;break;}
		if(flag) {puts("No");continue;} else goto end;
		end:puts("Yes");
		for(int i=1;i<=n;++i) putchar(ans[i]+'a'-1);
		puts("");
	}
}

#include <bits/stdc++.h>

using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ordered_set tree<long long, null_type,less<long long>, rb_tree_tag,tree_order_statistics_node_update>

template <typename T>
void resize(int n, vector<T> &u) {
  u.resize(n);
}

template <typename Head, typename... Tail>
void resize(int n, Head &H, Tail&... T) {
  resize(n, H);
  resize(n, T...);
}

template <typename T>
void debug_out(T t) {
  cerr << t;
}

template <typename A, typename B>
void debug_out(pair<A, B> &u) {
  cerr << "(" << u.first << " " << u.second << ")";
}

template <typename T>
void debug_out(vector<T> &t) {
  int sz = t.size();
  for(int i = 0; i < sz; i++) {
    debug_out(t[i]);
    if(i != sz - 1) cerr << ", ";
  }
}

template <typename T>
void debug_out(vector<vector<T>> &t) {
  int sz = t.size();
  for(int i = 0; i < sz; i++) {
    debug_out(t[i]);
    if(i != sz - 1) cerr << endl;
  }
}

vector<char> lowchar = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
vector<char> hichar = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
vector<char> base_10 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

template <typename T>
string to_string(T t) {
  ostringstream ss;
  ss << t;
  return ss.str();
}

long long to_num(string t) {
  long long res = 0;
  for(int i = 0; i < (int) t.length(); i++) {
    res *= 10;
    res += t[i] - '0';
  }
  return res;
}

#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:" << endl, debug_out(__VA_ARGS__), cerr << endl;
#define range(i, m, n) for(int i = m; i < n; i++)
#define husk(i, m, n) for(int i = m; i > n; i--)

int n, m;
vector<vector<int>> edges, e, pos(3);

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  vector<int> was(n, -1);
  resize(n, edges, e);
  range(i, 0, m) {
    int u, v;
    cin >> u >> v;
    u--; v--;
    edges[u].push_back(v);
    edges[v].push_back(u);
  }
  range(i, 0, n) if((int)edges[i].size() == n - 1) {
    pos[1].push_back(i);
    was[i] = 1;
  }
  int cnt = 0;
  range(i, 0, n) {
    if(was[i] == 1) continue;
    for(auto j : edges[i]) if(was[j] != 1) e[i].push_back(j);
    if(was[i] == -1) {
      was[i] = cnt;
      if(cnt < 3) pos[cnt].push_back(i);
      for(auto j : e[i]) {
        was[j] = cnt;
        if(cnt < 3) pos[cnt].push_back(j);
      }
      cnt += 2;
    }
  }
  bool ok = true;
  if(cnt > 2) ok = false;
  else {
    range(i, 0, n) {
      if(was[i] == 1) continue;
      if(e[i].size() != pos[was[i]].size() - 1) {
        ok = false;
        break;
      }
      for(auto j : e[i]) if(was[j] != was[i]) ok = false;
    }
  }
  if(!ok) {
    cout << "No";
    return 0;
  }
  else {
    cout << "Yes\n";
    string res;
    range(i, 0, n) res += 'a';
    for(auto i : pos[1]) res[i] = 'b';
    for(auto i : pos[2]) res[i] = 'c';
    cout << res;
  }
  return 0;
}

/*input
4 3
1 2
1 3
1 4

*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
//order_of_key #of elements less than x
// find_by_order kth element
using ll = long long;
using ld = long double;
using pii = pair<ll,ll>;
#define f first
#define s second
#define pb push_back
#define REP(i,n) for(int i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<=n;i++)
#define FILL(n,x) memset(n,x,sizeof(n))
#define ALL(_a) _a.begin(),_a.end()
#define sz(x) (int)x.size()
const ll INF64=8e18;
const int INF=0x3f3f3f3f;
const ll MOD=998244353;
const ld PI=acos(-1);
const ld eps=1e-9;
#define lowb(x) x&(-x)
#define MNTO(x,y) x=min(x,(__typeof__(x))y)
#define MXTO(x,y) x=max(x,(__typeof__(x))y)
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
ll mult(ll a,ll b){
    return ((a%MOD)*(b%MOD))%MOD;
}
ll mypow(ll a,ll b){
    if(b<=0) return 1;
    ll res=1LL;
    while(b){
        if(b&1) res=mult(res,a);
        a=mult(a,a);
        b>>=1;
    }
    return res;
}
const ll maxn=500+5;
const ll maxlg=__lg(maxn)+2;
set<int> s[maxn];
string ans;
void dfs(int u){
    for(int x:s[u]){
        if(ans[x]=='b'){
            ans[x]='c';
            dfs(x);
        }
        else{
            if(ans[x]==ans[u]){
                cout<<"No";
                exit(0);
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0);
    int n,m;
    cin>>n>>m;
    ans.resize(n);
    REP(i,n) ans[i]='b';
    REP(i,n) REP(j,n) if(i!=j) s[i].insert(j);
    REP(i,m){
        int a,b;
        cin>>a>>b;
        --a;
        --b;
        s[a].erase(b);
        s[b].erase(a);
    }
    REP(i,n){
        if(sz(s[i]) and ans[i]=='b'){
            ans[i]='a';
            dfs(i);
        }
    }
    cout<<"Yes\n";
    cout<<ans;
}

#include <bits/stdc++.h>
#define ALL(e) e.begin(), e.end()
#define RALL(e) e.rbegin(), e.rend()
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define dbg(x) (cerr << #x << ":" << x)
#define mid (l + r) / 2
#define fi first
#define sc second
#define N 1000000009

using namespace std;

typedef long long int lli;

int main(){
	ios::sync_with_stdio(0);

	int n, m;
	cin >> n >> m;

	bool matrix[n+100][n+100];
	vector <vector <lli>> adj(n+100);
	bool ex[n+100];

	memset(matrix, 1, sizeof(matrix));
	memset(ex, 0, sizeof(ex));

	for(int i=0; i<m; i++){
		int a, b;
		cin >> a >> b;

		matrix[a][b] = 0;
		matrix[b][a] = 0;
	}

	for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++){
			if(i == j) continue;

			if(matrix[i][j]){
				adj[i].pb(j);
				adj[j].pb(i);
				ex[i] = 1;
				ex[j] = 1;
 			}
		}
	}

	vector <bool> visited(n+100, false);
	queue <pair <lli, lli>> q;
	vector <lli> color(n+100, -1);

	for(int i=1; i<=n; i++){
		if(ex[i]){
			ex[i] = 0;
			q.push({i, 1});

			while(!q.empty()){
				lli node = q.front().fi, c = q.front().sc;
				q.pop();

				for(auto chi: adj[node]){
					if(visited[chi]) continue;
					visited[chi] = 1;

					color[chi] = 1-c;
					q.push({chi, 1-c});
				}
			}

			for(int j=1; j<=n; j++){
				for(auto chi: adj[j]){
					if(color[j] == color[chi]){
						cout << "NO";
						return 0;
					}
				}
			}
		}
	}

	cout << "YES" << endl;

	for(int i=1; i<=n; i++){

		if(color[i] == -1)
			cout << "b";
		else if(color[i] == 1)
			cout << "a";
		else if(color[i] == 0)
			cout << "c";
	}

	return 0;
}

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int col[505];
int a[505][505];
int n,m;
void dfs(int x)
{
    int i;
    for (i=0;i<n;i++)
    {
        if (i==x) continue;
        if (col[i]==-2) continue;
        if (col[i]==-1)
        {
            col[i]=col[x]^a[x][i];
            dfs(i);
        }
        if ((col[i]^col[x])==a[x][i]) continue;
        puts("No");
        exit(0);
    }
}

int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    scanf("%d%d",&n,&m);
    int i;
    for (i=0;i<m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        x--;
        y--;
        a[x][y]=1;
        a[y][x]=1;
    }
    memset(col,-1,sizeof(col));
    for (i=0;i<n;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            if (a[i][j]) break;
        }
        if (j==n) col[i]=-2;
    }
    for (i=0;i<n;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            a[i][j]=a[i][j]^1;
        }
    }
    for (i=0;i<n;i++)
    {
        if (col[i]==-1)
        {
            col[i]=0;
            dfs(i);
        }
    }
    puts("Yes");
    for (i=0;i<n;i++)
    {
        if (col[i]==0) printf("a");
        if (col[i]==1) printf("c");
        if (col[i]==-2) printf("b");
    }
    printf("\n");
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define fst first
#define snd second
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
#define pb push_back
#define for_tests(t, tt) int t; scanf("%d", &t); for(int tt = 1; tt <= t; tt++)
template<typename T> inline T abs(T t) { return t < 0? -t : t; }
const ll modn = 1000000007;
inline ll mod(ll x) { return x % modn; }

const int MAXN = 510, MAXM = MAXN*MAXN;

int n, m, deg[MAXN], c[MAXN];

vector<int> adj[MAXN];

int cntb = 0, degb = n-1;
int dega = -1, degc = -1;
int cnta = 0, cntc = 0;
int fodeu = 0;

void go(int v){
    for(int a=0;a<adj[v].size();a++){
        int nxt = adj[v][a];
        if(c[nxt] != 0) continue;
        c[nxt] = c[v];
        go(v);
    }
}

int main (){
    dega = -1, degc = -1;
    cnta = 0, cntc = 0;
    fodeu = 0;
    scanf("%d%d", &n, &m);
    cntb = 0, degb = n-1;
    for(int a=0;a<m;a++){
        int u, v;
        scanf("%d%d", &u, &v);
        deg[u]++;
        deg[v]++;
        adj[u].pb(v);
        adj[v].pb(u);
   }
    for(int a=1;a<=n;a++)
        if(deg[a] == degb)
            c[a] = 2;

    for(int a=1;a<=n;a++){
        if(c[a] == 1)
            cnta++;
        else if(c[a] == 2)
            cntb++;
        else if(c[a] == 3)
            cntc++;

        if(c[a] != 0) continue;

        if(dega == -1){
		    c[a] = 1;
            dega = deg[a];
            cnta++;
            go(a);
        }
        else if(degc == -1){
            c[a] = 3;
            degc = deg[a];
            cntc++;
            go(a);
        }
        else{
            fodeu = 1;
            //printf("fodeu 1\n");
            break;
        }
    }
    if(cnta != 0 && dega != cnta-1 + cntb){
        fodeu = 1;
        //     printf("f2\n");
    }
    if(cntc != 0 && degc != cntc-1 + cntb){
        fodeu = 1;
    //    printf("f3\n");
    }
    if(fodeu || cnta + cntb + cntc != n){
        printf("No\n");
        return 0;
    }
    puts("Yes");
    for(int a=1;a<=n;a++){
        printf("%c", 'a'-1+c[a]);
    }
    printf("\n");
}

#include <bits/stdc++.h>

using namespace std;

int n, m, B = 0;
bool a[550][550];
bool b[550][550];
vector <int> vst;
queue <int> q;
bool visit[550];
vector <char> v(550, 'a');

void bfs() {
	while(q.size()) {
		int k = q.front();
		q.pop();
		visit[k] = 1;
		for(int i=0; i<n; i++) {
			if(a[i][k] == 1 && visit[i] == 0 && v[i] != 'b') {
				q.push(i);
			}
		}
	}
}

int component_number() {
	memset(visit, 0, sizeof visit);
	int c = 0;
	for(int i=0; i<n; i++) {
		if(visit[i] == 0 && v[i] != 'b') {
			c++;
			q.push(i);
			bfs();
		}
	}
	return c;
}

bool check() {
	int r = component_number();
	if(r > 2) return 1;
	if(r == 2) {
		int X = vst[0], Y = n;
		for(int i=1; i<vst.size(); i++) {
			if(vst[i-1] < vst[i]) {
				if(Y == n) Y = vst[i];
				else return 1;
			}
		}
		if(Y == n) {
			if(n-B == X+X+2) return 0;
			return 1;
		}
		if(n-B == Y+X+2) return 0;
		return 1;
	}
	if(r == 1) {
		int X = vst[0];
		for(int i=1; i<vst.size(); i++) if(vst[i-1] < vst[i]) return 1;
		if(X+1 == n-B) return 0;
		return 1;
	}
	// we should have just two complete sub graph !!
	// else answer 1
	return 0;
}

int main() {
//	freopen("in.txt", "r", stdin);
	cin >> n >> m;
	memset(a, 0, sizeof a);
	memset(b, 0, sizeof b);
	int t1, t2;
	for(int i=0; i<m; i++) {
		cin >> t1 >> t2;
		t1--;
		t2--;
		a[t1][t2] = 1;
		a[t2][t1] = 1;
		b[t1][t2] = 1;
		b[t2][t1] = 1;
	}
	int s[n];
	memset(s, 0, sizeof s);
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			s[i] += a[i][j];
		}
		if(s[i] == n-1) {
			B++;
			for(int k=0; k<n; k++) {
				b[i][k] = 0;
				b[k][i] = 0;
			}
			v[i] = 'b';
		}
	}
//	for(int i=0; i<n; i++) {
//	for(int j=0; j<n; j++) cout << a[i][j] <<", ";
//	cout << endl;}
//	cout << "B : " << B << endl;
	for(int i=0; i<n; i++) {
		s[i] -= B;
		if(v[i] == 'a') vst.push_back(s[i]);
	}
	sort(vst.begin(), vst.end());
//	for(int i=0; i<vst.size(); i++) {
//		cout << vst[i] << endl;
//	}
	if(check()) {
		cout << "No";
		return 0;
	}
	int tmp;
	bool f = 0;
	for(int i=0; i<n; i++) {
		if(v[i] != 'b') {
			tmp = i;
			f = 1;
			break;
		}
	}
	if(f == 1) {
		for(int i=0; i<n; i++) {
			if(a[i][tmp] == 0 && tmp != i && v[i] != 'b') {
				v[i] = 'c';
			}
		}
	}/**/
	cout << "Yes" << endl;
	for(int i=0; i<n; i++) cout << v[i];
	return 0;
}

#pragma warning (disable : 4996)
#pragma comment(linker, "/STACK:36777216")

#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <iomanip>
#include <ctime>
#include <algorithm>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
#define sqr(x) ((x) * (x))
#define mp make_pair

const ll INF = 1e17 + 7;
const ll MOD = 1e9 + 7;
const ld PI = acos(-1.0);
const int NUM = 507;

int g[NUM][NUM];
int cnt[NUM];
vector<int> as, bs, cs;

bool check(int v, char col){
	if (col == 'a'){
		for (int i = 0; i < as.size(); ++i)
		if (!g[v][as[i]])
			return false;
		for (int i = 0; i < cs.size(); ++i)
		if (g[v][cs[i]])
			return false;
	}
	else if (col == 'c'){
		for (int i = 0; i < cs.size(); ++i)
		if (!g[v][cs[i]])
			return false;
		for (int i = 0; i < as.size(); ++i)
		if (g[v][as[i]])
			return false;
	}
	return true;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout << fixed << setprecision(14);
#ifdef DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#else
	//freopen(CONTEST ".in", "r", stdin);
	//freopen(CONTEST ".out", "w", stdout);
#endif

	int n, m;
	cin >> n >> m;
	for (int i = 0; i < m; ++i){
		int a, b;
		cin >> a >> b;
		--a; --b;
		g[a][b] = g[b][a] = 1;
		++cnt[a]; ++cnt[b];
	}

	string ans = "";
	for (int v = 0; v < n; ++v){
		g[v][v] = 1;
		ans += 'a';
		if (find(as.begin(), as.end(), v) != as.end() ||
			find(bs.begin(), bs.end(), v) != bs.end() ||
			find(cs.begin(), cs.end(), v) != cs.end()
			) continue;

		if (cnt[v] == n){
			bs.push_back(v);
		}
		else{
			int v1 = -1;
			for (int i = 0; i < n; ++i)
			if (!g[v][i])
				v1 = i;
			if (check(v1, 'a') && check(v, 'c')){
				if (find(as.begin(), as.end(), v1) == as.end())
					as.push_back(v1);
				cs.push_back(v);
			}
			else if (check(v1, 'c') && check(v, 'a')){
				if (find(cs.begin(), cs.end(), v1) == cs.end())
					cs.push_back(v1);
				as.push_back(v);
			}
			else{
				cout << "No";
				return 0;
			}
		}
	}
	for (int i = 0; i < bs.size(); ++i)
		ans[bs[i]] = 'b';
	for (int i = 0; i < cs.size(); ++i)
		ans[cs[i]] = 'c';

	cout << "Yes" << endl;
	cout << ans;

	return 0;
};

#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;
typedef long long li;
const li MAX = 501;
li n, m, inf = 10000000099999, used[MAX], ans[MAX], cnt1 = 0, cnt2 = 0, cnt3 = 0;
vector<li> gr[MAX];
bool ok = 1;
void dfs(li vert) {
	used[vert] = 1;
	if (!(gr[vert].size() == cnt2 + cnt1) && !(gr[vert].size() == cnt2 + cnt3)) ok = 0;
	if (ans[vert] == 2) ok = 1;
	for (auto i : gr[vert]) {
		if (abs(ans[i] - ans[vert]) == 2) {
			ok = 0;
			return;
		}
	}
	for (auto i : gr[vert]) {
		if (!used[i]) dfs(i);
	}
}
int main() {
	ios::sync_with_stdio();
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		li a, b;
		cin >> a >> b;
		gr[a].push_back(b);
		gr[b].push_back(a);
	}
	for (int i = 1; i <= n; i++) {
		if (gr[i].size() != n - 1) {
			for (int j = 0; j < gr[i].size(); j++) {
				ans[i] = 1;
				if (gr[gr[i][j]].size() != n - 1) ans[gr[i][j]] = 1;
			}
			break;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (!ans[i]) {
			if (gr[i].size() == n - 1) ans[i] = 2;
			else ans[i] = 3;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (ans[i] == 1) cnt1++;
		else if (ans[i] == 2) cnt2++;
		else cnt3++;
	}
	dfs(1);
	if (ok) {
		cout << "Yes" << "\n";
		for (int i = 1; i <= n; i++) {
			if (ans[i] == 1) cout << "a";
			else if (ans[i] == 2) cout << "b";
			else cout << "c";
		}
	}
	else cout << "No";
	//system("pause");
	return 0;

}

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

#define fst first
#define snd second
#define pb push_back
#define mp make_pair
#define pq priority_queue
#define fr(i,n)	for(int i=0;i<n;i++)
#define frr(i,n) for(int i=1;i<=n;i++)

#define ms(x, v) memset(x, v, sizeof x)
#define all(x)	x.begin(),x.end()

#define dbg(x) cout << #x << " = " << x << endl
#define olar() cout << "olaarr" << endl
#define gnl cout << endl

const int INF = 0x3f3f3f3f;

typedef long long int ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pair<int,int>> vii;

vi nodes[501];
vi new_nodes[501];
int words[501];
int vis[501];
int are[501][501];	//checa se coloquei a aresta no grafo novo

char letra(int x){
	if(x==0)	return 'a';
	if(x==1)	return 'b';
	if(x==2)	return 'c';
	if(x==-1)	return 'X';
}

int dfs_check(int v){		//checa se o grafo eh consistente (a não liga em c)

	if(vis[v]==1)	return 0;

	vis[v]=1;
	int tam = new_nodes[v].size();

	int check=0;
	fr(i,tam){

		int filho=new_nodes[v].size();
		if( abs(words[v]-words[filho])==2 ){
			return -1;
		}
		if(vis[filho]!=1)	check=dfs_check(filho);

	}

	return check;

}

void dfs_build(int v, int num){

	if(vis[v]!=0)	return;

	vis[v]=1;
	words[v]=num;

	int tam = new_nodes[v].size();

	fr(i,tam){

		int filho = new_nodes[v][i];

		if(words[filho] == -1 && vis[filho]==0)
			dfs_build(filho,num);

	}

}

int main(){

	int n,m;

	ms(words,-1);

	cin >> n >> m;

	fr(i,m){
		int a,b;
		cin >> a >> b;
		nodes[a].pb(b);
		nodes[b].pb(a);
	}

	int start=-1;

	frr(i,n){					//se tiver n-1 arestas nesse no eh pq eh a letra b
		if(nodes[i].size()==n-1){
			words[i]=1;			//pinto como b
		}
		else{					//caso contrario marco esse no pra pintar a partir dele depois
			start = i;
		}
	}

	frr(i,n){					//construo o grafo ignorando as letras b

		for( int j=0;j<nodes[i].size();j++ ){

			int filho = nodes[i][j];

			if(words[i]!=1 && words[filho]!= 1 && are[i][filho]==0 ){
				new_nodes[i].pb( filho );
				new_nodes[ filho ].pb(i);
				are[i][filho]=1;
				are[filho][i]=1;
			}

		}

	}

	if(start!=-1){				//se tiver algo alem de b pra ser pintado
		dfs_build(start,0);		//pinto os nodes conexos como a

		frr(i,n){				//procuro algo q nao foi pintado e pinto tudo a partir dele como c
			if(words[i]==-1){
				dfs_build(i,2);
				break;
			}
		}

	}
	else{						//se eh tudo b, entao ja era eh valido e printo a string
		cout << "Yes" << endl;
		fr(i,n)	cout << "b";
		gnl;
		return 0;
	}

	ms(vis,0);					//reseto a tag de visitados pra poder fazer a checagem de consistencia do novo grafo

	int flag =dfs_check(start);	//checo a consistencia do grafo

	if(flag==-1){
		cout << "No" << endl;
		return 0;
	}

	frr(i,n){
		if(words[i]==-1){
			cout << "No" << endl;
			return 0;
		}
	}

	cout << "Yes" << endl;

	frr(i,n){
		cout << letra(words[i]);
	}
	gnl;

	return 0;

}

#include<iostream>
#include<map>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<stack>
#include<math.h>
#include<set>
#include<string>
#include<cstring>
#include<queue>
#include<complex>
#include<cstdio>
#include<bitset>
using namespace std;

#define FilesX
#define TimeX
#define DEBUG

#ifdef DEBUG
#define DBG(x,s) cout<<s<<": "#x"="<<x<<"\n";
#else
#define DBG(x,s)
#endif
#define P(x) cout<<#x<<" = { "<<x<<" }\n"
#define All(a) (a).begin(), (a).end()
#define rep(i,n) for(int i=0;i<int(n);i++)
#define repd(i,n) for(int i=n-1;i>=0;i--)
#define repi(i,a,n) for(int i=int(a);i<int(n);i++)
#define foreach(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define clr(a, n) memset(a, n, sizeof(a));
#define scn(a,n) rep(i,n) cin>>a[o[0]];
#define scn2(a,row,col) rep(i,row) rep(j,col) cin>>a[o[0]][j];
#define prn(a,n) rep(i,n-1) cout<<a[o[0]]<<" "; cout<<a[n-1]<<endl;
#define prn2(a,row,col) rep(i,row){rep(j,col-1) cout<<a[o[0]][j]<<" "; cout<<a[o[0]][col-1]<<endl;}
#define dri(x) scanf("%d",&(x))
#define drii(x,y) scanf("%d%d",&(x),&(y))
#define drl(x) scanf("%I64d",&(x))
#define drll(x,y) scanf("%I64d%I64d",&(x),&(y))
#define mp(a, b) make_pair(a, b)
#define Odd(x) x%2!=0
#define Even(x) x%2==0
#define PI 3.1415926535897932384626433832795
#define INF 1e9 + 10
#define LLINF 1e18 + 10
const double EPS = (1e-7);
int dcmp(double x, double y) { return fabs(x-y) <= EPS ? 0 : x < y ? -1 : 1; }

typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<long> vl;
typedef vector<ll> vll;
typedef vector<double> vd;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef pair<int, string> is;
typedef vector<pii> vii;

ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
ll lcm(ll a, ll b) { return (a * (b / gcd(a, b))); }
bool in_range(int i, int j, int n, int m) { return i >= 0 && i < n && j >= 0 && j < m; }

//*---------------------------*/

int n, m;
vector<vi >adj;

vi dfs_num, dfs_low, S, visited; // global variables
int dfsNumberCounter, numSCC;
vector<vi > SCC;

int b[555];
void tarjanSCC(int u) {
	dfs_low[u] = dfs_num[u] = dfsNumberCounter++; // dfs_low[u] <= dfs_num[u]
	S.push_back(u); // stores u in a vector based on order of visitation
	visited[u] = 1;
	for (int j = 0; j < (int)adj[u].size(); j++) {
		int v = adj[u][j];
		if (b[v])continue;
		if (dfs_num[v] == -1)
			tarjanSCC(v);
		if (visited[v]) // condition for update
			dfs_low[u] = min(dfs_low[u], dfs_low[v]); }
	if (dfs_low[u] == dfs_num[u]) { // if this is a root (start) of an SCC
		//printf("SCC %d:", ++numSCC); // this part is done after recursion
		while (1) {
			int v = S.back(); S.pop_back(); visited[v] = 0;
			//printf(" %d", v);
			SCC[numSCC].push_back(v);
			if (u == v) break;
		}
		numSCC++;
	}
}

int a[555][555];

void solution(){
	cin>>n>>m;
	adj = vector<vi >(n);
	SCC = vector<vi >(n);
	rep(i, m){
		int x, y;
		cin>>x>>y;
		x--; y--;
		adj[x].push_back(y);
		adj[y].push_back(x);
		a[x][y] = 1;
		a[y][x] = 1;
	}

	rep(i, n){
		rep(j, n){
			rep(k, n){
				if ((a[i][j] && a[i][k] && !a[j][k]) && (i != j && j != k)){
					b[i] = 1;
				}
			}
		}
	}
	dfs_num.assign(n, -1); dfs_low.assign(n, 0); visited.assign(n, 0);
	dfsNumberCounter = numSCC = 0;
	for (int i = 0; i < n; i++)
		if (dfs_num[i] == -1 && !b[i])
			tarjanSCC(i);
	rep(i, numSCC){
		rep(j, SCC[i].size()){
			rep(k, j+1, SCC[i].size()){
				if ((!a[SCC[i][j]][SCC[i][k]] || !a[SCC[i][k]][SCC[i][j]]) && (SCC[i][k] != SCC[i][j])){
					cout<<"NO";
					return;
				}
			}
		}
	}
	if (numSCC == 1){
		cout<<"YES\n";
		rep(i, n) cout<<"a";
	}
	else if (numSCC == 2){
		cout<<"YES\n";
		string s = "";
		rep(i, n) s += 's';
		rep(i, SCC[0].size()) s[SCC[0][i]] = 'a';
		rep(i, SCC[1].size()) s[SCC[1][i]] = 'c';
		rep(i, n) if (b[i]) s[i] = 'b';
		cout<<s;
	}
	else cout<<"NO";
}

//*---------------------------*/
int main(){
	#ifdef Files
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif
	double beg=clock();

	ios::sync_with_stdio(false);
	solution();

	#ifdef Time
	cout << endl;
	double end=clock();
	printf("*** Total time = %.3f sec ***", (end - beg) / CLOCKS_PER_SEC);
	#endif
	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 <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)) {
				for (int j = 0; j < 10; ++j) {
					cout << uu.back().first << ' ' << uu.back().second << endl;
					uu.pop_back();
				}
				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 <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <map>
#include <queue>
#include <stdlib.h>
#include <set>
#include <algorithm>
#include <math.h>
#include <stack>
#define M_PI           3.14159265358979323846
#define fi first
#define se second

using namespace std;

typedef long long ll;

int G[501][501];
int conj[501], viz[501];

int main() {
	ios_base::sync_with_stdio(0);

	int n,m,a,b;
	memset(G,0,sizeof(G));
	memset(viz,0,sizeof(viz));
	memset(conj,0,sizeof(conj));
	cin >> n >> m;

	for(int i = 0; i < m; i++){
		cin >> a >> b;
		G[a][b] = true;
		G[b][a] = true;
		viz[a]++;
		viz[b]++;
	}
	bool flag = false;
	int c = 1;
	for(int i = 1; i <= n; i++){
		if(viz[i] == n-1)
			conj[i] = 2;
		else if(conj[i] == 0){
			conj[i] = c;
			for(int j = 1; j <= n; j++){
				if(G[i][j]){
					if(!conj[j]) conj[j] = c;
				}

			}
			c += 2;
		}
	}

	if(c > 5){
		cout << "No\n";
		return 0;
	}

	cout << "Yes\n";
	for(int i = 1; i <= n; i++)
		cout << (char)(conj[i]+96);
	cout << "\n";

	return 0;
}

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<deque>
using namespace std;
const int MAX_N = 505;

int sm[MAX_N][MAX_N];
vector<int> e[MAX_N];
int flag[MAX_N];
char s[MAX_N];
deque<int> q;

void bfs(int st_v)
{
	q.clear();
	q.push_back(st_v);
	flag[st_v] = 1;
	s[st_v] = 'a';
	while ((int)q.size() > 0)
	{
		int v = q[0];
		q.pop_front();
		for (int i = 0; i < (int)e[v].size(); i++)
		{
			int new_v = e[v][i];
			if (flag[new_v] == flag[v])
			{
				cout << "No";
				exit(0);
			}
			if (flag[new_v] == 0)
			{
				flag[new_v] = 3 - flag[v];
				if (flag[new_v] == 1)
					s[new_v] = 'a';
				else
					s[new_v] = 'c';
				q.push_back(new_v);
			}
		}
	}
	return;
}

int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		x--;
		y--;
		sm[x][y] = sm[y][x] = 1;
	}

	for (int i = 0; i < n; i++)
		for (int j = i + 1; j < n; j++)
			if (sm[i][j] == 0)
			{
				e[i].push_back(j);
				e[j].push_back(i);
			}

	for (int i = 0; i < n; i++)
		s[i] = 'b';

	for (int i = 0; i < n; i++)
		if (flag[i] == 0)
			bfs(i);

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

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define IOS ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)

using namespace std;

typedef pair<int, int> pii;

int main () {
    IOS;
    int n, m;
    cin >> n >> m;
    bool G[n][n];
    memset(G, false, sizeof(G));
    pii V[n];
    for (int i = 0; i < n; i++) V[i] = pii(n, i);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        u--; v--;
        G[u][v] = G[v][u] = true;
        V[u].first--;
        V[v].first--;
    }
    sort(V, V+n);
    char ans[n];
    vector<int> determinados;
    memset(ans, '*', sizeof(ans));
    ans[V[0].second] = 'b';
    for (int i = 1; i < n; i++) {
        int x = V[i].second;
        if (V[i].second == 0) {
            ans[x] = 'b';
            continue;
        }
        if (ans[x] != '*') continue;
        ans[x] = 'a';
        for (int j = 0; j < n; j++) {
            if (x == j) continue;
            if (!G[x][j]) {
                if (ans[j] == 'a' || ans[j] == 'b') {
                    cout << "No" << endl;
                    return 0;
                }
                ans[j] = 'c';
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j) continue;
            if (ans[i] == 'a' && ans[j] == 'c' || ans[j] == 'a' && ans[i] == 'c') {
                if (G[i][j]) {
                    cout << "No" << endl;
                    return 0;
                }
            } else {
                if (!G[i][j]) {
                    cout << "No" << endl;
                    return 0;
                }
            }
        }
    }
    cout << "Yes" << endl;
    for (int i = 0; i < n; i++) cout << ans[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;
#define ll long long int
#define pb push_back
#define io_file freopen("input_file.txt", "r", stdin); freopen("output_file.in", "w", stdout)

ll power(ll x, ll y){
	ll mod=1e9+7;
	ll ans = 1;
	while(y>0){
		if(y&1) ans = (ans*x)%mod;
		y = y>>1;
		x = (x*x)%mod;
	}
	return ans;
}
int g[505][505];
bool dfs(int s, vector<int>&vis, int n){
	// cout<<s<<"|";
	for(int i=1; i<=n; i++){
		if(g[s][i] == 0 && i != s){
			if(vis[i] == vis[s]) return 0;
			if(vis[i] != -1) continue;
			vis[i] = 1-vis[s];
			if(!dfs(i, vis, n)) return 0;
		}
	}
	return 1;
}

void solve(int T){
	int n,m;
	cin>>n>>m;
	memset(g, 0, sizeof(g));
	int deg[505];
	memset(deg, 0, sizeof(deg));
	for(int i=0; i<m; i++){
		int x,y;
		cin>>x>>y;
		g[x][y] = 1;
		g[y][x] = 1;
		deg[x]++;
		deg[y]++;
	}
	vector<int>vis(505, -1);
	for(int i=1; i<=n; i++){
		if(deg[i] < n-1 && vis[i] == -1){
			vis[i] = 0;
			if(!dfs(i, vis, n)){
				cout<<"No";
				return;
			}
		}
	}
	cout<<"Yes"<<endl;
	string ans = "";
	for(int i=1; i<=n; i++){
		if(vis[i] == 0) ans += 'a';
		else if(vis[i] == 1) ans += 'c';
		else ans += 'b';
	}
	cout<<ans;
}

int main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin>>t;
    for(int i=1; i<=t; i++)
	    solve(i);
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxm 260000
ll color[maxm],in[maxm];
vector<ll> adj[maxm];
bool visited[maxm];
ll num;
void dfs(ll i)
{
    ll u;
    color[i]=num;
    visited[i]=true;
    for(ll j=0;j<adj[i].size();j++)
    {
        u=adj[i][j];
        if((!visited[u])&&(color[u]==-1))
        {
            dfs(adj[i][j]);
        }
    }
}
int main()
{
    ll n,m,i,x,y,cnt;
    cin>>n>>m;
    for(i=0;i<m;i++)
    {
        cin>>x>>y;
        adj[x].push_back(y);
        adj[y].push_back(x);
        in[x]++;
        in[y]++;
    }
    memset(color,-1,sizeof(color));
    for(i=1;i<=n;i++)
    {
        if(in[i]==n-1)
        {
            color[i]=1;         //assigning character 'b'
        }
    }
    cnt=0;
    for(i=1;i<=n;i++)
    {
        if(color[i]==-1)
        {
            if(cnt%2==0)
            {
                num=0;
                dfs(i);
            }
            else
            {
                num=2;
                dfs(i);
            }
            cnt++;
        }
    }
    if(cnt>2)
    {
        cout<<"No";
    }
    else
    {
        cout<<"Yes\n";
        for(i=1;i<=n;i++)
        {
            cout<<(char)('a'+color[i]);
        }
    }
    return 0;
}

///Bismillahir Rahmanir Rahim
#include<bits/stdc++.h>
#define M 555
using namespace std;
int n,m;
int d[M+2];
int clr[M+2];
vector<int>adj[M+2];
void dfs(int u)
{
    int sz=adj[u].size();
    clr[u]=2;
    for(int i=0;i<sz;i++)
    {
        int v=adj[u][i];
        if(clr[v]==0)
        {
            dfs(v);
        }
    }
}
int x[M+2],y[M+2];
main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        d[u]++;
        d[v]++;
        adj[u].push_back(v);
        adj[v].push_back(u);
        x[i]=u;
        y[i]=v;
    }
    int root=-1;
    for(int i=1;i<=n;i++)
    {
        if(d[i]==(n-1))
        {
            clr[i]=1;
        }
        else root=i;
    }
    if(root!=(-1))
    {
        dfs(root);
    }
    for(int i=1;i<=n;i++)
    {
        if(clr[i]==0)
        {
            clr[i]=3;
        }
    }
    for(int i=1;i<=m;i++)
   {

       int u=x[i];
       int v=y[i];
       if( (clr[u]==3 && clr[v]==1) || (clr[u]==1 && clr[v]==3) )
       {
           cout<<"No"<<endl;
           return 0;
       }
   }
    cout<<"Yes"<<endl;
    for(int i=1;i<=n;i++)
    {
        if(clr[i]==1)
        {
            cout<<"a";
        }
        else if(clr[i]==2)
        {
            cout<<"b";
        }
        else
        {
            cout<<"c";
        }
    }
    cout<<endl;
    return 0;
}

#include <iostream>

#define fi first
#define se second
#define pb(x) push_back(x)
#define sqr(x) ((x)*(x))
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
#define cs(x) printf("Case %d: ", x)

using namespace std;
template <class T> inline void umax(T &x,T y) {if (y > x) x = y;}
template <class T> inline void umin(T &x,T y) {if (y < x) x = y;}
typedef long long ll;
typedef pair <int, int> pii;

const int N = 5e2 + 5, B = 0x7fffffff;
int cnt[N], col[N];
char ans[] = {' ', 'a', 'b', 'c'};
bool adj[N][N], res = 1;
int n, m;

int main(){
  cin >> n >> m;
  for (int i = 1, x, y; i <= m; i++){
    cin >> x >> y;
    cnt[x]++, cnt[y]++;
    adj[x][y] = adj[y][x] = 1;
  }
  for (int i = 1; i <= n; i++)
    if (cnt[i] == n - 1) col[i] = 2;
  for (int i = 1; i <= n; i++){
    if (col[i] == 0){
      col[i] = 1;
      for (int j = 1; j <= n; j++){
        if (col[j] != 0)
          continue;
        if (adj[i][j] == 1) col[j] = 1;
        else col[j] = 3;
      }
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++){
      if (adj[i][j] == 0 && !((col[i] == 1 && col[j] == 3) || (col[i] == 3 && col[j] == 1))) res = 0;
      else if (((col[i] == 1 && col[j] == 3) || (col[i] == 3 && col[j] == 1))) res = 0;
    }
  if (res) {cout << "Yes\n"; for (int i = 1; i <= n; i++) cout << ans[col[i]];}
  else puts("No");

  return !1;
}

 // In the name of GOD
 // I love my love

#include<bits/stdc++.h>

/*
#include <iostream>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <algorithm>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
*/

#define pb push_back
#define pp pop_back()
#define fr first
#define sc second
#define sz size()
#define P 3.1415926535
#define mp make_pair
#define CS; ios_base::sync_with_stdio(false); cin.tie(false); cout.tie(false);
 // #define forn(i,x,n) for(int(i)=int(x);i<int(n);i++)

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair <int,int> ii;
typedef vector <int> vi;

const int M=5e2+5;
int a[M][M];
char s[M];
int cnt[M];
int n,m;
bool t;
bool k=0;

void check(int x)
{
    for(cnt[x]+1;cnt[x]<n;cnt[x]++)
    {
        int i=cnt[x]+1;
        if(!a[x][i])
        {
            if(!t)
            {
                s[x]=='a';
                t=1;
            }
            a[x][i]=2;
            a[i][x]=2;
            if(s[x]==s[i])
            {
                k=1;
                return;
            }
            if(s[x]=='c')
                s[i]='a';
            else s[i]='c';
            check(i);
            if(k)
                return;
        }
    }
}

int main()
{
    CS;
    cin>>n>>m;
    while(m--)
    {
        int z,b;
        cin>>z>>b;
        a[z][b]=1;
        a[b][z]=1;
    }
    for(int i=1;i<=n;i++)
        a[i][i]=1;
    for(int i=1;i<=n;i++)
        check(i);
    if(k)
    {
        cout<<"No";
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j]==1)
                if((s[i]=='c' && s[j]=='a') || (s[j]=='c' && s[i]=='a'))
                {
                    cout<<"No";
                    return 0;
                }
    cout<<"Yes\n";
    for(int i=1;i<=n;i++)
    {
        if(s[i]!='c' && s[i]!='a')
            cout<<'b';
        else cout<<s[i];
    }
    return 0;
}

#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <stdint.h>
char graph[501][501];
char values[501];

using namespace std;
int main()
{
    int n,m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        for(int k = 1; k <= n; k++){
            if(i != k)
                graph[i][k] = '-';
            values[i] = '-';
        }
    }
    int row,column;
    for(int i = 1; i <= m; i++){
        cin >> row >> column;
        graph[row][column] = '1';
        graph[column][row] = '1';
    }
    int used[501] = {0};
    for(int i = 1; i <= n; i++){
        for(int k = 1; k <= n; k++){
            if(graph[i][k] == '-')
                used[i] = 1;
        }
    }
    bool flag = false;
    for(int i = 1; i <= n; i++){
        if(!used[i]){
            values[i] = 'b';
            flag = true;
        }
    }
    if(!flag){
        cout << "No";
        return 0;
    }

    int visited[501] = {0};
    for(int i = 1; i <= n; i++)
        if(values[i] == 'b')
            visited[i] = 1;
    flag = true;
    for(int i = 1; i <=n; i++){
        if(visited[i] != 1){
            visited[i] = 1;
            if(flag){
                flag = false;
                values[i] = 'a';
            }
            else
                values[i] = 'c';
            for(int k = 1; k <= n; k++){
                if(graph[i][k] == '1' && values[k] != 'b'){
                    visited[k] = 1;
                    values[k] = values[i];
                }
            }
        }
    }
    for(int i  = 1; i <= n; i++){
        for(int k = 1; k <= n; k++)
            if(graph[i][k] == '-' && abs(values[i]-values[k]) <= 1){
                cout << "No";
                return 0;
            }
    }
    cout << "Yes" << endl;
    for(int i = 1; i <= n; i++)
        cout << values[i];
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define sz size()
#define x first
#define y second
#define mp make_pair
#define mpp(a,b,c) mp(mp(a,b),c)
#define pb push_back
#define all(v) v.begin(),v.end()
#define EPS 1e-9
#define MOD 1000000007
#define MAX 505
typedef pair<int,int> pii;
typedef long long ll;

int N,M;
int A[MAX][MAX];
int S[MAX];

int main()
{
    scanf("%d %d",&N,&M);
    for(int i=0; i<M; i++)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        A[u][v] = A[v][u] = 1;
    }

    for(int u=1; u<=N; u++)
        for(int v=u+1; v<=N; v++)
        {
            if(!A[u][v])
            {
                if(S[u] && S[v])
                if(S[u] == S[v]) { printf("NO"); return 0; }
                else continue;
                if(S[u] && !S[v])
                if(S[u] == 'c') S[v] = 'a'; else S[v] = 'c';
                if(S[v] && !S[u])
                if(S[v] == 'c') S[u] = 'a'; else S[u] = 'c';
                if(!S[u] && !S[v]) S[u] = 'a', S[v] = 'c';
            }
        }

    printf("YES\n");
    for(int i=1; i<=N; i++)
        if(S[i])
        printf("%c",S[i]);
    else
        printf("b");

}

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
using namespace std;

vector<int> link[505];

int main()
{
	int n, m, n1, n2, fillcnt = 0;
	char ans[505] = { 0 };
	bool is_ans = true;

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

	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		cin >> n1 >> n2;
		link[n1].push_back(n2);
		link[n2].push_back(n1);
	}

	for (int i = 1; i <= n; i++) {
		if (link[i].size() == n - 1) {
			ans[i] = 'b';
		}

		if (ans[i] == '\0' && fillcnt < 2) {
			for (int j = 0; j < link[i].size(); j++) {
				ans[link[i][j]] = (fillcnt == 0 ? 'a' : 'c');
			}
			ans[i] = (fillcnt == 0 ? 'a' : 'c');
			fillcnt++;
		}
		else if (ans[i] == '\0' && fillcnt == 2) {
			is_ans = false;
			break;
		}
	}

	if (is_ans) {
		cout << "Yes" << endl << ans << endl;
	}
	else {
		cout << "No" << endl;
	}
	return 0;
}

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pf push_front;
#define fbo find_by_order
#define ook order_of_key
#define lb lower_bound
#define ub upper_bound
#define rep(i,n) for(int i=0;i<n;i++)
#define fo(j,a,b) for(int j=a;j<=b;j++)
#define mem(x,a) memset(x,a,sizeof(x))

typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<ll> vi;
typedef long double ld;
typedef map<ll,ll> spt;
typedef set<ll> si;
typedef multiset<ll>::iterator sit;
typedef map<int,int>::iterator mi;
typedef vector<int>::iterator vit;
typedef vector<ii> vii;
typedef set<ii> sii;
typedef multiset<ll> msi;
typedef vector< vector<ll> > matrix;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> ost;
typedef tree<ii,null_type,greater<ii>,rb_tree_tag,tree_order_statistics_node_update> ost1;
const ll INF = 1e18;
const int MOD = 1e9 + 7;
const int N = 1e6 +5;
char c[N];
vi adj[N];
ll vis[N];
map<char,ll> gm;
void dfs(ll u,char k)
{
    vis[u]=1;
    c[u]=k;
    gm[k]++;
    for(auto it:adj[u])
    {
        if(!vis[it])
        {
            dfs(it,k);
        }
    }
}
int main()
{
    ll n,m;
    cin>>n>>m;
    ll a,b;
    rep(i,m)
    {
        cin>>a>>b;
        adj[a].pb(b);
        adj[b].pb(a);
    }
    for(int i=1;i<=n;i++)
        if(adj[i].size()==n-1)
        c[i]='b',vis[i]=1;
    for(int i=1;i<=n;i++)
        if(vis[i]==0){
        dfs(i,'a');
        break;
        }
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==0){
            dfs(i,'c');
            break;
        }
    }
    for(int i=1;i<=n;i++)
        if(vis[i]==0 || (c[i]!='b' && adj[i].size()!=gm[c[i]]-1))
    {
        cout<<"No";
        return 0;
    }
    cout<<"Yes\n";
    for(int i=1;i<=n;i++)
        cout<<c[i];
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>

#define pb push_back
#define mp make_pair
#define LL long long
#define LD long double
#define maxlongint 2147483647

using namespace std;

const int inf = 999999999;
const int mod = 1000000007;

inline int Getint()
{
	char ch = getchar();
	while (ch < '0' || ch > '9') ch = getchar();
	int ret = 0;
	while (ch >= '0' && ch <= '9') ret = ret * 10 + ch - '0', ch = getchar();
	return ret;
}

int color[510];
bool g[510][510];
bool flag;
int n, m, x, y;

void Dfs(int node, int cc)
{
	//printf("node, cc = %d %d\n", node, cc);
	if (color[node])
	{
		if (color[node] != cc) flag = false;
		return;
	}
	color[node] = cc;
	for (int i = 1; i <= n; i++)
	{
		if (node != i && !g[node][i])
		{
			Dfs(i, 4 - cc);
		}
		if (!flag) return;
	}
}

int main()
{
	n = Getint(), m = Getint();
	for (int i = 1; i <= m; i++)
	{
		x = Getint(), y = Getint();
		g[x][y] = g[y][x] = true;
	}

	flag = true;
	bool cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		if (!color[i])
		{
			cnt++;
			int tot = 0;
			for (int j = 1; j <= n; j++)
			{
				tot += g[i][j];
			}
			if (tot != n - 1) Dfs(i, 1);
		}
		if (!flag) break;
	}
	if (!flag || cnt > 1)
	{
		puts("No");
		return 0;
	}
	puts("Yes");
	for (int i = 1; i <= n; i++)
	{
		if (!color[i]) color[i] = 2;
		printf("%c", color[i] + 96);
	}
	puts("");
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int graph[N][N];
char sol[N];
int n, m;
void build() {
  cin >> n >> m;
  int u, v;
  for (int i = 1; i <= n; i++) {
    sol[i] = '.';
  }
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    graph[u][v] = graph[v][u] = 1;
  }
}
void solve() {
  for (int i = 1; i <= n; i++) {
    bool isb = true;
    for (int j = 1; j < i; j++) {
      if (!graph[j][i]) {
        isb = false;
        if (sol[j] == 'b') {
          cout << "No\n";
          exit(0);
        } else if (sol[j] == 'a' || sol[j] == 'c') {
          if (sol[i] == '.') {
            sol[i] = sol[j] == 'a' ? 'c' : 'a';
          } else if(sol[i] == sol[j]) {
            cout << "No\n";
            exit(0);
          }
        }
      }
    }
    if (!isb && sol[i] == '.') {
      sol[i] = 'a';
      for (int j = 1; j < i; j++) {
        if (!graph[j][i]) {
          sol[j] = 'c';
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
      if (graph[i][j] && ((sol[i] == 'a' && sol[j] == 'c') || (sol[i] == 'c' && sol[j] == 'a'))) {
        cout << "No\n";
        exit(0);
      }
    }
  }
  cout << "Yes\n";
  for (int i = 1; i <= n; i++) {
    cout << (sol[i] == '.' ? 'b' : sol[i]);
  }
  cout << "\n";
}
int main(int argc, char const *argv[]) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  build();
  solve();
  return 0;
}

//BISMILLAHIRRAHMANIRRAHIM
/*
 manus tar shopner soman boro
 all my suceesses are dedicated to my parents
 The true test of a man's character is what he does when no one is watching.
 Don't let your dreams be dreams.

 Author :: Shakil Ahmed
.............AUST_CSE27.........
 prob   ::
 Type   ::
 verdict::

*/

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair

// Macro
#define eps 1e-9
#define pi acos(-1.0)
#define ff first
#define ss second
#define re return
#define QI queue<int>
#define SI stack<int>
#define SZ(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
#define sq(a) ((a)*(a))
#define distance(a,b) (sq(a.x-b.x) + sq(a.y-b.y))
#define iseq(a,b) (fabs(a-b)<eps)
#define eq(a,b) iseq(a,b)
#define ms(a,b) memset((a),(b),sizeof(a))
#define G() getchar()
#define MAX3(a,b,c) max(a,max(b,c))
#define II ( { int a ; read(a) ; a; } )
#define LL ( { Long a ; read(a) ; a; } )
#define DD ({double a; scanf("%lf", &a); a;})

double const EPS=3e-8;
using namespace std;

#define FI freopen ("input.txt", "r", stdin)
#define FO freopen ("output.txt", "w", stdout)

typedef long long Long;
typedef long long int64;
typedef unsigned long long ull;
typedef vector<int> vi ;
typedef set<int> si;
typedef vector<Long>vl;
typedef pair<int,int>pii;
typedef pair<string,int>psi;
typedef pair<Long,Long>pll;
typedef pair<double,double>pdd;
typedef vector<pii> vpii;

// For loop

#define forab(i, a, b)	for (__typeof (b) i = (a) ; i <= b ; ++i)
#define rep(i, n)		forab (i, 0, (n) - 1)
#define For(i, n)		forab (i, 1, n)
#define rofba(i, a, b)	for (__typeof (b)i = (b) ; i >= a ; --i)
#define per(i, n)		rofba (i, 0, (n) - 1)
#define rof(i, n)		rofba (i, 1, n)
#define forstl(i, s)	for (__typeof ((s).end ()) i = (s).begin (); i != (s).end (); ++i)

template< class T > T gcd(T a, T b) { return (b != 0 ? gcd<T>(b, a%b) : a); }
template< class T > T lcm(T a, T b) { return (a / gcd<T>(a, b) * b); }
#define __(args...) {dbg,args; cerr<<endl;}
struct debugger{template<typename T> debugger& operator , (const T& v){cerr<<v<<"\t"; return *this; }}dbg;
#define __1D(a,n) rep(i,n) { if(i) printf(" ") ; cout << a[i] ; }
#define __2D(a,r,c,f) forab(i,f,r-!f){forab(j,f,c-!f){if(j!=f)printf(" ");cout<<a[i][j];}cout<<endl;}

template<class A, class B> ostream &operator<<(ostream& o, const pair<A,B>& p){ return o<<"("<<p.ff<<", "<<p.ss<<")";} //Pair print
template<class T> ostream& operator<<(ostream& o, const vector<T>& v){ o<<"[";forstl(it,v)o<<*it<<", ";return o<<"]";} //Vector print
template<class T> ostream& operator<<(ostream& o, const set<T>& v){ o<<"[";forstl(it,v)o<<*it<<", ";return o<<"]";} //Set print

//Fast Reader
template<class T>inline bool read(T &x){int c=getchar();int sgn=1;while(~c&&c<'0'||c>'9'){if(c=='-')sgn=-1;c=getchar();}for(x=0;~c&&'0'<=c&&c<='9';c=getchar())x=x*10+c-'0'; x*=sgn; return ~c;}

//int dx[]={1,0,-1,0};int dy[]={0,1,0,-1}; //4 Direction
//int dx[]={1,1,0,-1,-1,-1,0,1};int dy[]={0,1,1,1,0,-1,-1,-1};//8 direction
//int dx[]={2,1,-1,-2,-2,-1,1,2};int dy[]={1,2,2,1,-1,-2,-2,-1};//Knight Direction
//int dx[]={2,1,-1,-2,-1,1};int dy[]={0,1,1,0,-1,-1}; //Hexagonal Direction

/* **************************************  My code start here ****************************************** */

const int NX = 505 ;

int connect[ NX ][ NX ] , n , m ;

char ans[ NX ];
int deg[ NX ];

int main()
{
   // I will always use scanf and printf
   // May be i won't be a good programmer but i will be a good human being

      n = II , m = II ;
      for( int i = 0 ;  i < m ; i++ )
      {
          int x = II ,  y = II ;
          if( y < x ) swap( x , y );
          connect[x][y] = 1 ;
          deg[x]++;
          deg[y]++;
      }
      for( int i = 1 ; i <= n ; i++ ) ans[i] = 'd';
      vector < int > pos ;
      for( int i = 1 ; i <= n ; i++ ) if( deg[i] == n - 1 ) ans[i] = 'b';
      else pos.pb( i );
      int sz = pos.size();
      int notok = 0 ;
      if( sz == 0 )
      {
          ans[n+1] = '\0';
          printf("%s\n",ans+1);
          return 0 ;
      }
      else
      {
          int id = pos[0];
          ans[id] = 'a';
          for( int j = 1 ; j < sz ; j++ )
          {
              int x = pos[j];
              if( connect[id][x] == 1 ) ans[x] = ans[id];
              else{
                if( ans[id] == 'a' ) ans[x] = 'c';
                else ans[x] = 'a';
              }
          }
          for( int i = 1 ; i <= n && notok == 0 ; i++ )
          {
              for( int j = i + 1 ; j <= n && notok == 0 ; j++ )
              {
                  if( connect[i][j] == 0 && ans[i] == ans[j] ) notok = 1 ;
              }
          }
          if( notok == 1 ) printf("No");
          else
          {
              puts("Yes");
              ans[n+1] = '\0';
              printf("%s\n",ans+1);
          }
      }

    return 0;
}

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef vector<vi> vvi;
int main()
{
	int n,m,i,j,p,q,c=0;
	cin>>n>>m;
	set<pi> S,Snot;
	set<int> S1;
	string str(n+1,'$');
	vvi G(n+1);
	for(i=1;i<=m;++i){
		cin>>p>>q;
		S.insert(make_pair(p,q));
		S.insert(make_pair(q,p));
		G[q].push_back(p);
		G[p].push_back(q);
	}
    if(m==((n)*(n-1))/2){
    	cout<<"Yes"<<endl;
    	for(i=1;i<=n;++i)
    		cout<<'a';cout<<endl;
    	return 0;
    }

	for(i=1;i<=n;++i){
		for(j=1;j<=n;++j){
			if(S.find(make_pair(i,j))==S.end() && i!=j){
               p=i;
               q=j;
               if(p>q) swap(p,q);
               Snot.insert(make_pair(i,j));
               c++;
			}
		}
	}
	str[p]='a';str[q]='c';
	vi :: iterator it1,it2;
	for(it1=G[p].begin();it1!=G[p].end();++it1){
		for(it2=G[q].begin();it2!=G[q].end();++it2){
			if(*it2==*it1){
               S1.insert(*it1);
			}
		}
	}
	set<int> :: iterator it3;
	for(it3=S1.begin();it3!=S1.end();++it3){
		str[*it3]='b';
	}
	for(it1=G[p].begin();it1!=G[p].end();++it1){
		if(S1.find(*it1)==S1.end()){
           str[*it1]=str[p];
		}
	}
	for(it1=G[q].begin();it1!=G[q].end();++it1){
		if(S1.find(*it1)==S1.end()){
           str[*it1]=str[q];
		}
	}
	for(i=1;i<=n;++i){
		for(j=i+1;j<=n;++j){
			if(Snot.find(make_pair(i,j))!=Snot.end()){
				if(str[i]==str[j] || str[i]+1==str[j] || str[j]+1==str[i]) ;
				else{
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}
	//cout<<5<<endl;
	cout<<"Yes"<<endl;
	for(i=1;i<=n;++i)
		cout<<str[i];cout<<endl;
}

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int data[505][505];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int i,j;
        memset(data,0,sizeof(data));
        for(i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            data[a][b]=1;
            data[b][a]=1;
        }
        int  flag=0;
        for(i=1;i<=n;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                if(flag)
                    break;

                if(data[i][j]==0)
                {
                    for(int k=j+1;k<=n;k++)
                    {
                        if(data[i][k]==0&&data[j][k]==0)
                        {
                            flag=1;
                            break;
                        }
                    }
                }

            }
        }

        if(flag)
        {
            printf("No\n");
            continue;
        }

        char ans[505];
        char wtf[505];
        memset(wtf,0,sizeof(wtf));
        for(i=1;i<=n;i++)
        {
           if(!wtf[i])
           {
               int fh=0;
               for(j=i+1;j<=n;j++)
               {
                   if(data[i][j]==0)
                   {
                       ans[i]='a';
                       wtf[i]=1;
                       for(int k=j;k<=n;k++)
                       {
                           if(data[i][k]==0)
                           {
                               ans[k]='c';
                               wtf[k]=1;
                           }

                       }
                       break;
                   }
               }
               if(wtf[i]==0)
               {
                   ans[i]='b';
                   wtf[i]=1;
               }
           }
        else
            {
                if(ans[i]=='b')
                    continue;
                else if(ans[i]=='a')
                {
                    for(j=i+1;j<=n;j++)
                    {
                        if(data[i][j]==0&&wtf[j]==0)
                        {
                            ans[j]='c';
                            wtf[i]=1;
                        }
                    }
                }
                else if(ans[i]=='c')
                {
                    for(j=i+1;j<=n;j++)
                    {
                        if(data[i][j]==0&&wtf[j]==0)
                        {
                            ans[j]='a';
                            wtf[i]=1;
                        }
                    }
                }

            }
        }

        printf("Yes\n");
        for(i=1;i<=n;i++)
        {

            printf("%c",ans[i]);
        }
        printf("\n");

    }
    return 0;
}

//In The Name Of God

#include<bits/stdc++.h>

using namespace std;

const int Maxn=507;

int n,m;
int E[Maxn][Maxn];
vector<int>V[Maxn];
int ans[Maxn];
bool mark[Maxn];

void dfs(int v)
{
  mark[v]=true;
  for(int i=0;i<V[v].size();i++)
    {
      int u=V[v][i];
      if(!mark[u])
	ans[u]=2-ans[v],dfs(u);
      else if(ans[u]==ans[v])
	{
	  cout<<"No"<<endl;
	  exit(0);
	}
    }
}

main()
{
  ios::sync_with_stdio(0);cin.tie(0);
  cin>>n>>m;
  for(int i=0;i<m;i++)
    {
      int u,v;
      cin>>u>>v;
      E[u][v]=E[v][u]=1;
    }
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      if(!E[i][j] and i!=j)
	V[i].push_back(j);
  for(int i=1;i<=n;i++)
    {
      if(!V[i].size())
	ans[i]=1,mark[i]=true;
      else if(!mark[i])
	ans[i]=2,dfs(i);
    }
  cout<<"Yes"<<endl;
  for(int i=1;i<=n;i++)
    cout<<(char)(ans[i]+'a');
  cout<<endl;
}

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;
const int N = 510,M=260010;

int h[N], e[M],ne[M],idx;
int g[N][N];
int color[N];
int d[N];
int n,m;

void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a] = idx++;
}

void dfs(int x,int c)
{
    color[x] = c;
    for(int i=h[x];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(!color[j]) dfs(j,c);
        else if(color[j]!= 2 || color[j]!= color[x]) return;
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        g[a][b]=g[b][a] = 1;
        add(a,b) , add(b,a);
        d[a] ++ ,d[b] ++;
    }

    for(int i=1;i<=n;i++) if(d[i]==n-1) color[i] = 2;

    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        if(!g[i][j])
        {
            dfs(i,1);//不能为0
            dfs(j,3);
            break;
        }

    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        {
            if(!color[i] || !color[j]) {puts("No") ; return 0;}
            if(abs(color[i]-color[j])==2 && g[i][j]) {puts("No") ; return 0;}
            if(abs(color[i]-color[j])<=1 && !g[i][j]) {puts("No") ; return 0;}
        }
    puts("Yes");
    for(int i=1;i<=n;i++)
        printf("%c",'a' + color[i] - 1);
    return 0;
}

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <set>
#include <unordered_set>
#include <limits>
#include <iomanip>
#include <ctime>
#include <map>
#include <unordered_map>
#include <deque>
#include <queue>
#include <stack>

#define vr vector
#define vri vector<int>
#define dq deque
#define dqi deque<int>
#define pri pair<int,int>
#define ll long long
#define fin(s,n) for( int i = s; i < n; i++ )
#define fjn(s,n) for( int j = s; j < n; j++ )

using namespace std;

const int MAXM = 125000;
const int MAXN = 500;
int n, m;
vr<vri> a(MAXN);
vri d(MAXN);
string ans(MAXN, '-');
int main() {

	scanf("%d%d", &n,&m);
	fin(0, m) {
		int u, v;
		cin >> u >> v;
		u--; v--;
		a[u].push_back(v);
		a[v].push_back(u);
		d[u]++;
		d[v]++;
	}
	bool aset = false;
	bool cset = false;
	int len = 0;
	fin(0, n) {
		if (d[i] == n - 1) {
			ans[i] = 'b';
			len++;
		}
	}
	fin(0, n) {
		if (ans[i] != '-')
			continue;
		if (cset)
			continue;
		char fillVal = 'a';
		if (aset)
			fillVal = 'c';
		ans[i] = fillVal;
		len++;
		fjn(0, a[i].size()) {
			if (ans[a[i][j]] == '-' && d[a[i][j]] == d[i]) {
				ans[a[i][j]] = fillVal;
				len++;
			}
		}
		if (!aset) {
			aset = true;
		}
		else {
			cset = true;
		}
	}
	if (len == n) {
		fin(0, n) {
			if (ans[i] == 'b')
				continue;
			char w = 'c';
			if (ans[i] == 'c')
				w = 'a';
			fjn(0, a[i].size()) {
				if (a[i][j] == w) {
					cout << "NO";
					return 0;
				}
			}
		}
		cout << "YES\n" << ans.substr(0, n);
	}
	else {
		cout << "NO";
	}
	return 0;
}

#include <bits/stdc++.h>
#define ll long long int
#define mod 1000000007
using namespace std;

static int graph[505][505];
char res[505];
int main()
{
    int i, j, m, n, u, v;
    scanf("%d %d", &n, &m);
    bool found = true;
    for(i=0; i<m; i++)
    {
        scanf("%d %d", &u, &v);
        graph[u][v] = graph[v][u] = 1;
    }
    for(i=0; i<=n; i++)
        res[i] = '-';
    for(i=1; i<=n; i++)
    {
        int cnt = 0;
        for(j=1; j<=n; j++)
        {
            if(j==i) continue;
            cnt+=graph[i][j];
        }
        if(cnt==n-1)
            res[i] = 'b';
    }
    for(i=1; i<=n; i++)
    {
        if(res[i]=='-') continue;
        res[i] = 'a';
        for(j=1; j<=n; j++)
        {
            if(graph[i][j]==0) continue;
            if(res[j]=='-') res[j] = 'a';
        }
    }
    for(i=1; i<=n; i++)
    {
        if(res[i]=='-') continue;
        res[i] = 'c';
        for(j=1; j<=n; j++)
        {
            if(graph[i][j]==0) continue;
            if(res[j]=='-') res[j] = 'c';
            else if(res[j]=='a')
            {
            	found = false;
            	break;
            }
        }
    }

    for(i=1; i<=n; i++)
        if(res[i]=='-') {found=false; break;}
    if(found==false)
    {
        cout<<"No\n"<<endl;
    }
    else
    {
        cout<<"Yes\n"<<endl;
        for(i=1; i<=n; i++) cout<<res[i];
        cout<<endl;
    }
    return 0;
}

#include <iostream>
#include "cstdio"

using namespace std;

int n, m;
char s[555];
bool g[555][555], no = false;

void dfs(int v, char c){
    //cout << v << ' ' << c << '\n';
    if (s[v] != 0 && s[v] != c) {
        no = true;
    }
    s[v] = c;
    for (int i = 1; i <= n; i ++){
        if (g[v][i] == false && s[i] == 0) {
            dfs(i, c == 'c' ? 'a' : 'c');
        }
    }
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i ++){
        int u, v;
        cin >> u >> v;
        g[u][v] = true;
        g[v][u] = true;
        g[u][u] = true;
        g[v][v] = true;
    }

    for (int i = 1; i <= n; i ++){
        if (s[i] == 0) {
            bool temp = true;
            for (int j = 1; j <= n; j ++){
                temp &= g[i][j];
            }
            if (temp == true) {
                //cout << i << '\n';
                s[i] = 'b';
            }else{
                dfs(i, 'a');
            }
        }
    }
//    for (int i = 1; i <= n; i ++)
//        cout << s[i];
//    cout << s << '\n';
    for (int i = 1; i <= n; i ++){
        for (int j = 1; j <= n; j ++){
            if (g[i][j] == true && !(abs(s[i] - s[j]) != 1 || s[i] != s[j])) {
                //cout << i << ' ' << j << '\n';
                no = true;
            }
            if(g[i][j] == false && (abs(s[i] - s[j]) == 1 || s[i] == s[j]))
                no = true;
        }
    }
    if (no) {
        cout << "No";
    }else{
        cout << "Yes\n";
        for (int i = 1; i <= n; i ++)
            cout << s[i];
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
int G[510][510];
int ds[510];
int n,m;
char ans[510];
void dfs(int now,int f){
    ans[now]='a'+f;
    for(int i=1;i<=n;i++){
        if(G[now][i]==0) continue;
        if(ans[i]!=0){
            if(ans[i]==ans[now])
                {
                    puts("No");
                    exit(0);
                }
        }
        else{
            dfs(i,f^2);
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;cin>>u>>v;
        G[u][v]=1;G[v][u]=1;
        ds[u]++;ds[v]++;
    }
    int flag=-1;
    for(int i=1;i<=n;i++){
        if(ds[i]==n-1){
            ans[i]='b';
        }else{
            flag=i;
        }
    }
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) G[i][j]=!G[i][j];
    if(flag!=-1){
        dfs(flag,0);
    }
    puts("Yes");
    printf("%s",ans+1);

    return 0;
}

/*************************************************************************
    > File Name: C.cpp
************************************************************************/
#include <cstdio>
#include <iostream>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <algorithm>
#include <assert.h>
using namespace std;
#define per(i,a,n) for(int i=n-1;i>=a;--i)
#define rep(i,a,n) for(int i=a;i<n;++i)
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef vector<int> VI;
typedef pair<int, int> PII;
#define lc(o) (o<<1)
#define rc(o) (o<<1|1)
ll powmod(ll a,ll b, ll MOD) {ll res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;}
/*----------- head-----------*/
const int maxn = 500 + 10;
int n, m;
vector<int> tv;
int c[maxn], vis[maxn];
vector<int> G[maxn];

bool dfs(int u, int d) {
    assert(c[u] != 3);
    if (c[u] == 3-d) return false;
    if (c[u] == d) return true;
    c[u] = d;
    for(int v: G[u]) if(!dfs(v, 3-d)) return false;
    return true;
}

int main() {
    //freopen("C.txt", "r", stdin);
    scanf("%d%d\n", &n, &m);
    rep(i, 0, m) {
        int d1, d2; scanf("%d%d\n", &d1, &d2);
        G[d1].pb(d2); G[d2].pb(d1);
    }

    rep(i, 1, n+1) {
        vector<int>& v = G[i];
        sort(all(v));
        tv.clear(); int p = 0;
        rep(j, 1, n+1) {
            if (j == i) continue;
            if (v.empty() || p>=v.size() || v[p]!=j)
                tv.pb(j);
            else ++p;
        }
        v = tv;
    }

    rep(i, 1, n+1) if (G[i].size() == 0) c[i] = 3;
    int pos = 1; while(c[pos]==3) ++pos;
    if (pos < n+1 && !dfs(pos, 1)) {
        printf("NO\n");
        exit(0);
    }

    printf("YES\n");
    rep(u, 1, n+1) {
        if (c[u] == 1) printf("a");
        else if (c[u] == 3) printf("b");
        else if (c[u] == 2) printf("c");
    }
    printf("\n");
}

          /*
          The woods are lovely, dark and deep,
          But I have promises to keep,
          And miles to go before I sleep,
          And miles to go before I sleep.
          */
          #include <bits/stdc++.h>
          using namespace std;
          #define tani_nachi_ke  ios_base::sync_with_stdio(false); cin.tie(NULL);
          #define M_PI 3.14159265358979323846
          #define data data_
          #define ff first
          #define ss second
          int const N = 509;
          vector<int> adj[N],adjb[N];
          int color[N];

          int main()
          {
          clock_t begin = clock();
          #ifndef ONLINE_JUDGE
          freopen("input.txt", "r", stdin);
          freopen("output.txt", "w", stdout);
          #endif
          tani_nachi_ke

          int n,m;
          cin>>n>>m;
          for(int i=0; i<m; i++)
          {
               int a,b;
               cin>>a>>b;
               adj[a].push_back(b);
               adj[b].push_back(a);
          }

          for(int i=1; i<=n; i++)
          {
               bool dp[n+1]={};
               for(int u:adj[i])dp[u]=1;
               for(int j=1; j<=n; j++)
                    if(i!=j&&!dp[j])
                         adjb[i].push_back(j);
          }

          queue<int> q;
          memset(color,-1,sizeof(color));
          bool ok=1;
          for(int i=1; i<=n; i++)
          {
               if(!adjb[i].empty()&&color[i]==-1)
                    {
                         q.push(i);
                         color[i]=0;
                    }
               while(!q.empty())
               {
                    int v = q.front();
                    q.pop();
                    for(int u:adjb[v])
                    {
                         if(color[u]==-1)
                         {
                              color[u]=color[v]^1;
                              q.push(u);
                         }
                         else ok&=(color[u]!=color[v]);
                    }
               }
          }
          if(ok)
          {
               cout<<"Yes\n";
               int ca=0,cc=0;
               for(int i=1; i<=n; i++)
               {
                    if(color[i]==-1)cout<<"b";
                    if(color[i]==0)cout<<"a";
                    if(color[i]==1)cout<<"c";
               }

          }
          else
               cout<<"No\n";

          #ifndef ONLINE_JUDGE
          clock_t end = clock();
          cout<<endl<<double(end - begin) / CLOCKS_PER_SEC*1000<<" ms";
          #endif
          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 <iostream>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <queue>
using namespace std;
int main()
{
	int n, m;
	int graph[501][501] = {0};
	cin >> n >> m;
	int u, v;
	for (int i = 0; i < m ; i++) {
		cin >> u >> v;
		graph[u][v] = 1;
		graph[v][u] = 1;
	}
	string ret;
	ret.assign(n, 'b');
	for (int i = 1; i <= n; i++)
	for (int j = i+1; j <= n; j++)
	{
		if (graph[i][j] == 0) {
			if(ret[i-1] == 'b') {
				queue<int> q;
				q.push(i);
				ret[i-1] = 'a';
				while (!q.empty()){
					int node = q.front();
					q.pop();
					for (int k = 1; k <= n; k++) {
						if (graph[node][k] == 0 && k != node) {
							if (ret[k-1] != 'b') {
								cout << "No";
								return 0;
							}
							ret[k-1] = (ret[node-1] == 'a') ? 'c' : 'a';
							q.push(k);
						}
					}
				}
			}
		}
	}
	cout << "Yes\n";
	cout << ret;
	return 0;
}

#include<bits/stdc++.h>

using namespace std;

#define ll long long int
#define T ll t; cin>>t ; while(t--)
#define fin freopen("input.txt","r",stdin)
#define fout freopen("o1.txt","w",stdout)
#define fastio ios_base::sync_with_stdio(false); cin.tie(0)
#define pf(n) cout<<n<<endl;

ll mod=1e9+7;

int graph[505][505];
vector< vector<int> > v(505);

int main(){

    ll n,m;
	cin>>n>>m;

	//printf("----");

    for(ll i=0;i<m;i++){
        ll x,y;
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
        graph[x][y]=1;
        graph[y][x]=1;
    }

	//printf("000\n");

    vector<char> s(505,'c');
	vector<bool> visited(505,0);

    for(int i=1;i<=n;i++){
        if(v[i].size()==n-1) {
            s[i]='b';
            visited[i]=1;
        }
    }

	//printf("1111\n");

    for(ll i=1;i<=n;i++){
        if(!visited[i]){
            visited[i]=1;
            s[i]='a';

            for(int j=0;j<v[i].size();j++){
                s[j]='a';
            }
            break;
        }
    }
	/*
	for(ll i=0;i<n;i++){
		cout<<s[i];
	}
	*/
    for(ll i=1;i<=n;i++){
		for(ll j=1;j<=n;j++){
            if(i!=j && graph[i][j]==0 && s[i]==s[j]){
				printf("No\n");
				return 0;
            }
		}
    }

	printf("Yes\n");

	for(ll i=1;i<=n;i++){
		cout<<s[i];
	}

    return 0;
}

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <cmath>
#include <sstream>
#include <string>
#define ll long long
#define mod 1000000007
const int INF=0x3f3f3f3f;
const int N=4e3+5;
using namespace std;

int t,n,m,x,y,z;
int mp[505][505]={0},vis[505]={0},cc=0,aa=0,bb=0,flag=0;
char c[505]={0};
int main(){
    cin>>n>>m;
    while(m--){
    	cin>>x>>y;
    	vis[x]++;
    	vis[y]++;
		mp[x][y]=mp[y][x]=1;

	}
	for(int i=1;i<=n;i++){
		if(vis[i]==n-1){
			if(bb==0) x=i;
			c[i]='b';
			bb++;
		}
	}
	for(int i=1;i<=n;i++){
		if(c[i]!='b'){
			if(mp[x][i]==1){
				if(aa==0) y=i;
				c[i]='a';
				aa++;
				break;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(c[i]!='b'&&c[i]!='a'){
			if(mp[y][i]==0){
				c[i]='c';
				if(cc==0) z=i;
				cc++;
			}else{
				c[i]='a';
				aa++;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(c[i]=='a'){
			if(vis[i]!=bb+aa-1) flag=1;
		}else if(c[i]=='c'){
			if(vis[i]!=cc+bb-1) flag=1;
		}
	}
	if(flag) cout<<"No"<<endl;
	else{
		cout<<"Yes"<<endl;
		for(int i=1;i<=n;i++){
			cout<<c[i];
		}
		cout<<endl;
	}
    return 0;
}