Problem: Kilani and Abd are neighbors for 3000 years, but then the day came and Kilani decided to move to another house. As a farewell gift, Kilani is going to challenge Abd with a problem written by their other neighbor with the same name Abd.

<image>

The problem is:

You are given a connected tree rooted at node 1.

You should assign a character a or b to every node in the tree so that the total number of a's is equal to x and the total number of b's is equal to n - x.

Let's define a string for each node v of the tree as follows: 

  * if v is root then the string is just one character assigned to v: 
  * otherwise, let's take a string defined for the v's parent p_v and add to the end of it a character assigned to v. 



You should assign every node a character in a way that minimizes the number of distinct strings among the strings of all nodes.

Input

The first line contains two integers n and x (1 ≤ n ≤ 10^5; 0 ≤ x ≤ n) — the number of vertices in the tree the number of a's.

The second line contains n - 1 integers p_2, p_3, ..., p_{n} (1 ≤ p_i ≤ n; p_i ≠ i), where p_i is the parent of node i.

It is guaranteed that the input describes a connected tree.

Output

In the first line, print the minimum possible total number of distinct strings.

In the second line, print n characters, where all characters are either a or b and the i-th character is the character assigned to the i-th node.

Make sure that the total number of a's is equal to x and the total number of b's is equal to n - x.

If there is more than one answer you can print any of them.

Example

Input


9 3
1 2 2 4 4 4 3 1


Output


4
aabbbbbba

Note

The tree from the sample is shown below:

<image>

The tree after assigning characters to every node (according to the output) is the following:

<image>

Strings for all nodes are the following: 

  * string of node 1 is: a
  * string of node 2 is: aa
  * string of node 3 is: aab
  * string of node 4 is: aab
  * string of node 5 is: aabb
  * string of node 6 is: aabb
  * string of node 7 is: aabb
  * string of node 8 is: aabb
  * string of node 9 is: aa



The set of unique strings is \{a, aa, aab, aabb\}, so the number of distinct strings is 4.

Solution (in CPP):

Solution:
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

template <typename T>
void read(T &x) {
	T f=1;x=0;char s=getchar();
	while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
	while(s>='0'&&s<='9') {x=(x<<3)+(x<<1)+(s^'0');s=getchar();}
	x *= f;
}

template <typename T>
void write(T x , char s='\n') {
	if(x<0) {putchar('-');x=-x;}
	if(!x) {putchar('0');putchar(s);return;}
	int tmp[22]={},t=0;
	while(x) tmp[t++]=x%10,x/=10;
	while(t-->0) putchar(tmp[t]+'0');
	putchar(s);
}

const int MAXN = 1e5 + 5;

int head[MAXN] , to[MAXN << 1] , nxt[MAXN << 1] , ecnt;
void add(int u , int v) {nxt[++ecnt] = head[u];head[u] = ecnt;to[ecnt] = v;} 

int n , x , dep[MAXN] , cnt , deg[MAXN] , c[500] , val[500] , us[500] , bl[MAXN];
pair <int , int> siz[MAXN];
int md;
char ans[MAXN];
vector <int> nod[MAXN];
bool cmp(int x , int y) {return deg[x] > deg[y];}

void pre(int x , int fa) {
	dep[x] = dep[fa] + 1;
	nod[dep[x]].push_back(x);
	md = max(md , dep[x]);
	siz[dep[x]].first ++;
	siz[dep[x]].second = dep[x];
	for (int i = head[x]; i; i = nxt[i]) {
		int v = to[i];
		if(v == fa) continue;
		pre(v , x);
	}
}

int f[480][MAXN];

int main() {
	read(n),read(x);
	for (int i = 2; i <= n; ++i) {
		int p;read(p);
		add(p , i);
		deg[p] ++ , deg[i] ++;
	}
	pre(1 , 0);
	sort(siz + 1 , siz + 1 + md);
	for (int i = 1; i <= md; ++i) {
		if(siz[i].first != siz[i - 1].first) c[++cnt] = 1 , val[cnt] = siz[i].first;
		else c[cnt] ++;
		bl[siz[i].second] = cnt;
	}
	for (int i = 1; i <= n; ++i) f[1][i] = -1;
	for (int j = 1; j <= c[1]; ++j) f[1][j * val[1]] = 0; 
	for (int i = 2; i <= cnt; ++i) {
		f[i][0] = 0;
		for (int j = 1; j <= n; ++j) {
			if(f[(i - 1)][j] != -1) f[i][j] = j;
			else if(j >= val[i] && f[i][j - val[i]] != -1 && (j - f[i][j - val[i]]) / val[i] <= c[i]) f[i][j] = f[i][j - val[i]];
			else f[i][j] = -1;
		}
	}
	if(f[cnt][x] != -1) {
		printf("%d\n" , md);
		int now = x;
		for (int i = cnt; i >= 1; --i) {
			us[i] = (now - f[i][now]) / val[i];
			now = f[i][now];
		}
		for (int i = 1; i <= md; ++i) {
			char cur;
			if(us[bl[i]]) cur = 'a' , us[bl[i]] --;
			else cur = 'b';
			for (int j = 0; j < (int)nod[i].size(); ++j) {
				ans[nod[i][j]] = cur;
			}
		}
		for (int i = 1; i <= n; ++i) putchar(ans[i]);
	}
	else {
		printf("%d\n" , md + 1);
		int y = n - x;
		char cx = 'a' , cy = 'b';
		for (int i = 1; i <= n; ++i) {
			sort(nod[i].begin() , nod[i].end() , cmp);
			if(x < y) swap(x , y) , swap(cx , cy);
			for (int j = 0; j < (int)nod[i].size(); ++j) {
				if(nod[i][j]) ans[nod[i][j]] = cx , x --;
				if(!x) swap(x , y) , swap(cx , cy);
			}
		}
		for (int i = 1; i <= n; ++i) putchar(ans[i]);
	}
	return 0;
}