
/**
 * Dont raise your voice, improve your argument.
 * --Desmond Tutu
 */
#include <bits/stdc++.h>
using namespace std;

const bool ready = [](){
    ios_base::sync_with_stdio(false); cin.tie(0);
    cout << fixed << setprecision(12);
    return true;
}();

using ld=long double;
const ld PI = acos((ld)-1);
using ll= long long;
#define int ll
#define all(v) (v).begin(), (v).end()
#define fori(n) for(int i=0; i<int(n); i++)

#define cini(i) int i; cin>>i;
#define cins(s) string s; cin>>s;
#define cind(d) ld d; cin>>d;
#define cinai(a,n) vi a(n); fori(n) { cin>>a[i]; }
#define cinas(s,n) vs s(n); fori(n) { cin>>s[i]; }
#define cinad(a,n) vd a(n); fori(n) { cin>>a[i]; }

using pii= pair<int, int>;
using pdd= pair<ld, ld>;
using vd= vector<ld>;
using vb= vector<bool>;
using vi= vector<int>;
using vvi= vector<vi>;
using vs= vector<string>;

#define endl "\n"


/** faster solution */
const int MAXN = 70;
ll C[MAXN + 1][MAXN + 1];

const bool init_nCr=[]() {
    C[0][0] = 1;
    for (int n = 1; n <= MAXN; ++n) {
        C[n][0] = C[n][n] = 1;
        for (int k = 1; k < n; ++k)
            C[n][k] = C[n - 1][k - 1] + C[n - 1][k];
    }
    return true;
}();

ll nCr(int n, int k) {
    return C[n][k];
}

/* aaaabbbb
 * aaababbb
 * aaabbabb
 * ...
 * aabaabbb
 * aabababb
 * ...
 * aababbba
 * Number of strings of len x with A 'a' is nCr(x,A)
 * So we check the prefixes until we found the right one.
 */
void solve() {
    cini(a);
    cini(b);
    cini(k);

    int cnt=a+b;

    string ans;
    for(int i=0; i<cnt; i++) {
        int num=nCr(a+b-1, a-1);    /* consider first letter a */
        if(b>0 && (a==0 || num<k)) {
            k-=num;
            ans.push_back('b');
            b--;
        } else {
            ans.push_back('a');
            a--;
        }
    }
    cout<<ans<<endl;
}

signed main() {
    solve();
}
/*
{
######################
#       Author       #
#        Gary        #
#        2021        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){
//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int MAXN=200000+233;
vector<int> g[MAXN];
int n;
mp fr;
int depth[MAXN],rest[MAXN],cnt;
void dfs(int now,int dis=0,int pre=0){
	check_max(fr,II(dis,now));
	for(auto it:g[now]) if(it!=pre){
		dfs(it,dis+1,now);
	}
}
void dfs2(int now,int pre=0){
	for(auto it:g[now]) if(it!=pre){
		depth[it]=depth[now]+1;
		dfs2(it,now);
	}
	for(auto it:g[now]) if(it!=pre){
		check_max(depth[now],depth[it]); 
	}
}
bool cmp(int A,int B){
	return depth[A]<depth[B];
}
void dfs3(int now,int pre=0){
	rest[now]=++cnt;
	vector<int> ord;
	for(auto it:g[now]) if(it!=pre) ord.PB(it);
	sort(ALL(ord),cmp);
	for(auto it:ord) dfs3(it,now),++cnt;
}
int main(){
	scanf("%d",&n);
	rb(i,1,n-1){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].PB(v);
		g[v].PB(u);
	}
	fr=II(-1,-1);
	dfs(1);
	int tmp=fr.SEC;
	fr=II(-1,-1);
	dfs(tmp);
	int root=fr.SEC;
	dfs2(root);
	dfs3(root);
	rb(i,1,n) printf("%d ",rest[i]);
	return 0;
}