For a string S, let f(S) be the lexicographically smallest cyclic shift of S. For example, if S = `babca`, f(S) = `ababc` because this is the smallest among all cyclic shifts (`babca`, `abcab`, `bcaba`, `cabab`, `ababc`).

You are given three integers X, Y, and Z. You want to construct a string T that consists of exactly X `a`s, exactly Y `b`s, and exactly Z `c`s. If there are multiple such strings, you want to choose one that maximizes f(T) lexicographically.

Compute the lexicographically largest possible value of f(T).

Constraints

* 1 \leq X + Y + Z \leq 50
* X, Y, Z are non-negative integers.

Input

Input is given from Standard Input in the following format:


X Y Z


Output

Print the answer.

Examples

Input

2 2 0


Output

abab


Input

1 1 1


Output

acb
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
#define REP(i,st,ed) for(int i=st,i##end=ed;i<=i##end;++i)
#define DREP(i,st,ed) for(int i=st,i##end=ed;i>=i##end;--i)
multiset<string>s;
multiset<string>::iterator it1,it2;
int a,b,c;
int main(){
	scanf("%d%d%d",&a,&b,&c);
	REP(i,1,a)s.insert("a");
	REP(i,1,b)s.insert("b");
	REP(i,1,c)s.insert("c");
	REP(i,1,a+b+c-1){
		it1=s.begin();
		it2=s.end(),--it2;
		s.insert(*it1+*it2);
		s.erase(it1);
		s.erase(it2);
	}
	cout<<*s.begin()<<endl;
	return 0;
}