#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
using namespace std;
struct Data {
int num;
string S;
bool operator <(const Data& s)const
{
if (num == s.num)
{
if (S.size() == s.S.size())
return S > s.S;
else
return S.size() > s.S.size();
}
else
return num > s.num; //最小堆
}
};
int Convert(string s)
{
int num = s.size();
int Sum = 0;
for (int i = 0; i < num; i++)
{
Sum += (s[i] - 48) * pow(10, num - i - 1);
}
return Sum;
}
int main()
{
int i, j, N;
string Data_In;
priority_queue<Data> Data_Pro;
cin >> Data_In;
int t = 0, p = 0, count = 0;
int flag = 1;
Data Save;
for (i = 0; i <= Data_In.size(); i++)
{
switch (flag)
{
case 1:
if (Data_In[i] >= 48 && Data_In[i] < 58)
{
Save.S = Data_In.substr(t, p - t);
//cout << Data_In.substr(t, p - t) << endl;
t = p + 1;
flag++;
}
else
{
p++;
//cout << p << endl;
}
break;
case 2:
if (Data_In[i] < 48 || Data_In[i] > 57)
{
Save.num = Convert(Data_In.substr(p, t - p));
Data_Pro.push(Save);
//cout << Save.num << endl;
p = t + 1;
flag = 1;
}
else
{
t++;
}
break;
}
}
while (!Data_Pro.empty())
{
Data C = Data_Pro.top();
for (i = 0; i < C.num; i++)
{
cout << C.S;
}
Data_Pro.pop();
}
//cin >> N;
return 0;
}