#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
const int sz=1e5+10;
const int sqsz=500;
std::vector<int>graph[sz],node[sz];
int dep[sz],maxd,belong[sz],deg[sz];
void dfs(int u,int fau){
dep[u]=dep[fau]+1;
maxd=std::max(maxd,dep[u]);
node[dep[u]].push_back(u);
for(int v:graph[u]){
if(v==fau)continue;
dfs(v,u);
}
}
int f[sqsz][sz],cnt[sz],val[sz],size[sz];
char ans[sz];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n,suma,sumb;
std::cin>>n>>suma,sumb=n-suma;
for(int i=2,f;i<=n;i++)
std::cin>>f,graph[f].push_back(i),deg[f]++,deg[i]++;
dfs(1,0);
for(int i=1;i<=maxd;i++)
size[i]=val[i]=node[i].size();
std::sort(val+1,val+maxd+1);
int l=std::unique(val+1,val+maxd+1)-val-1;
for(int i=1;i<=maxd;i++){
size[i]=std::lower_bound(val+1,val+l+1,size[i])-val;
cnt[size[i]]++,belong[i]=size[i];
}
std::fill(f[1]+1,f[1]+suma+1,-1);
for(int i=1;i<=cnt[1];i++)f[1][i*val[1]]=0;
for(int i=2;i<=l;i++){
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]<=cnt[i])f[i][j]=f[i][j-val[i]];
else f[i][j]=-1;
}
}
if(f[l][suma]!=-1){
std::cout<<maxd<<"\n";
int use[sz],cur=suma;
for(int i=l;i>=1;i--){
use[i]=(cur-f[i][cur])/val[i];
cur=f[i][cur];
}
for(int i=1;i<=maxd;i++){
if(use[belong[i]]!=0){
use[belong[i]]--;
for(int u:node[i])ans[u]='a';
}else for(int u:node[i])ans[u]='b';
}
}else{
std::cout<<maxd+1<<"\n";
char a='a',b='b';
for(int i=1;i<=maxd;i++){
std::sort(node[i].begin(),node[i].end(),[](int x,int y)->bool {
if(deg[x]!=deg[y])return deg[x]<deg[y];
return dep[x]<dep[y];
});
if(suma<sumb)std::swap(suma,sumb),std::swap(a,b);
for(int u:node[i]){
if(suma!=0)suma--,ans[u]=a;
else sumb--,ans[u]=b;
}
}
}
for(int i=1;i<=n;i++)std::cout<<ans[i];
return 0;
}