#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>

typedef long long lLong;
typedef unsigned long uLong;
typedef unsigned long long ulLong;
typedef unsigned int uInt;
typedef unsigned char Byte;

using namespace std;

#define FOR(x, b, e) for(int x=b; x<=(e); ++x)
#define ALL(i) (i).begin(), (i).end()
#define CONTAINS(i,v) (find(ALL(i),v)!=(i).end())
typedef vector<bool> bit_vector;
typedef vector<ulLong> VI;
typedef vector<ulLong> VLL;


#define MAX_N 1001


class PrzypadekTestowy
{
private:	
	int _n;
	lLong _k;

	const char _mapa[4] = { '\0', 'a','b','c' };
	const char _przejscia[4][3] =
	{
		{ 1,2,3 },{ 2,3,0 },{ 1,3,0 },{ 1,2,0 }
	};

	inline void Reset()
	{		
	}

	inline void WczytajWspolczynniki(FILE *input)
	{
		fscanf(input, "%d %lld\n", &_n, &_k);
	}

public:

	inline void WczytajPrzypadekTestowy()
	{
		WczytajPrzypadekTestowy(stdin);
	}
	inline void WczytajPrzypadekTestowy(FILE *input)
	{
		Reset();		
		WczytajWspolczynniki(input);
	}
	inline int WypiszZnak(int poprzedni, int idx)
	{
		poprzedni = _przejscia[poprzedni][idx];
		printf("%c", _mapa[poprzedni]);
		return poprzedni;
	}

	inline void Rozwiaz()
	{
		int poprzedni = 0;
		const int okresMax = 60;

		int minN = min(okresMax, _n);

		//dla n>60 okres przekracza maksymalne k wiec to beda praktycznie same 'ab'
		while (_n > okresMax && _k>1)
		{
			poprzedni = WypiszZnak(poprzedni, 0);
			_n--;
			_k--;
		}

		//obliczenie okresu "startowego" gdy mamy już n<=60
		lLong okres = (lLong)pow(2, _n) - 1;

		//jeśli k jest poza zakresem zbioru rozwiązań - to nie ma sensu szukać
		if (_k > okres*3)
		{
			poprzedni = -2;
			_n = 0;
		}

		while (_n > 0)
		{
			int idx;
			//ustawiamy idx w tym okresie w którym występuje k 
			for (idx = 0; idx < 3; idx++)
			{
				if (_k > okres) _k -= okres;
				else break;
			}			
			poprzedni = WypiszZnak(poprzedni, idx);
			//jesli k osiągnęło kraniec - to kończymy
			if (_k == 1) break;
			_k--;
			_n--;
			//okres bez pierwszego elementu zmniejsza się o połowę - pow(2,_n)-1 też zadziała
			okres = (okres - 1) / 2;			
		}

		if (poprzedni < 0)
		{
			printf("NIE");
		}
		printf("\n");
	}
};

int main(int argc, char **argv)
{	
	FILE *in = stdin;
	if (argc>1)
	{
		in = fopen(argv[1], "rt");
		if (NULL == in)
		{
			in = stdin;
		}
	}
	PrzypadekTestowy p;
	p.WczytajPrzypadekTestowy(in);	
	p.Rozwiaz();	
	return 0;
}
