#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define int long long
unsigned long long n;
int a,b;
int C[100][100];
signed main()
{
	cin>>a>>b>>n;
	C[1][0]=1,C[1][1]=1;
	for(int i=2;i<=60;i++)
	{
		for(int j=0;j<=i;j++)
		{
			C[i][j]=C[i-1][j]+C[i-1][j-1];
		}
	}
	while(a>=1&&b>=1)
	{
		if(n>C[a-1+b][b]) n-=C[a-1+b][b],putchar('b'),b--;
		else putchar('a'),a--;
//		cout<<n<<endl;
	}
//	cout<<endl<<a<<' '<<b<<endl;
	for(int i=1;i<=a;i++) putchar('a');
	for(int i=1;i<=b;i++) putchar('b');
}

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1000000007;
#define INF 1LL<<60
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define all(x) (x).begin(),(x).end()

template <class T>
bool chmin(T &a, const T &b) {
    if (b < a) {
        a = b;
        return 1;
    }
    return 0;
}
int V;
ll G[20][20];  // グラフ
ll dp[200000][20];
int main() {
    cin >> V;
    // グラフの初期化
    rep(i, 20) {
        rep(j, 20) { G[i][j] = INF; }
    }
 
    vector<ll> x(V),y(V),z(V);
    rep(i, V) {
        cin>>x[i]>>y[i]>>z[i];
    }
    
    rep(i,V){
        rep(j,V){
            G[i][j]=abs(x[j]-x[i])+abs(y[j]-y[i])+max(0LL,z[j]-z[i]);
        }
    }
 
    // dp の初期化
    rep(i, 200000) {
        rep(j, 20) { dp[i][j] = INF; }
    }
    dp[0][0] = 0;  // スタートを頂点 0 とする
    rep(S, 1 << V) {
        rep(v, V) {
            rep(u, V) {
                if ((S & (1 << v)) == 0) {
                    if (v != u) chmin(dp[S | (1 << v)][v], dp[S][u] + G[u][v]);
                }
            }
        }
    }
    if (dp[(1 << V) - 1][0] != INF) {
        cout << dp[(1 << V) - 1][0] << endl;
    } else {
        cout << -1 << endl;
    }
    return 0;
}