#include <iostream>
using namespace std;

template <class x> class Stack {
public:
	Stack	(int m);
	~Stack	();
	int		StackIsFull();
	int		StackIsEmpty();
	void	Push(x e);
	void	Pop(x& e);
	void	PrintStack();
private:
	int		maxsize;
	int		top;
	x		*p;
};

int main(){

	char f[64], e;
	cin.getline(f,64);
	Stack<char> s(64);
	int i=0;

	while(f[i] != '\0')
	{
		if (f[i] == '(' || f[i] == '{' || f[i] == '[')
			s.Push(f[i]);
		else if (f[i] == ')' || f[i] == '}' || f[i] == ']'){
			while(!s.StackIsEmpty()){
				s.Pop(e);
				if (e != '(' && e != '{' && e != '[')
					cout << e;
				else
					break;
			}
		}
		else if (f[i] == '+' || f[i] == '-'){
			while(!s.StackIsEmpty()){
				s.Pop(e);
				if (e != '(' && e != '{' && e != '[')
					cout << e;
				else{
					s.Push(e);
					break;
				}
			}
			s.Push(f[i]);
		}
		else if (f[i] == '*' || f[i] == '/'){
			while(!s.StackIsEmpty()){
				s.Pop(e);
				if (e != '(' && e != '{' && e != '[' && e != '+' && e != '-')
					cout << e;
				else{
					s.Push(e);
					break;
				}
			}
			s.Push(f[i]);
		}
		else
			cout << f[i];

		i++;
	}

	while(!s.StackIsEmpty()){
		s.Pop(e);
		cout << e;
	}


	return 0;
}

template <class x> Stack<x>::Stack(int m){
	maxsize = m;
	top = -1;
	p = new x[maxsize];
}

template <class x> Stack<x>::~Stack(){
	delete [] p;
}

template <class x> int Stack<x>::StackIsFull(){
	if (top == maxsize - 1)
			return 1;
	return 0;
}

template <class x> int Stack<x>::StackIsEmpty(){
	if (top == -1)
			return -1;
	return 0;
}

template <class x> void Stack<x>::Push(x e){
	if (!StackIsFull()){
		top++;
		p[top] = e;
	}
}

template <class x> void Stack<x>::Pop(x &e){
	if (!StackIsEmpty()){
		e = p[top];
		top--;
	}
}

template <class x> void Stack<x>::PrintStack(){
	x e;
	if (!StackIsEmpty()){
		Pop(e);
		PrintStack();
		cout << e << endl;
		Push(e);
	}
}