//”消去“的栈模拟
#include<iostream>
#include<stack>

using namespace std;

int main()
{
    string s;
    while(cin>>s)
    {
        stack<char> st;
        string str;
        st.push(s[0]);
        int len=(int)s.length();
        for(int i=1;i<len;i++)
        {
            //oo|oO|OO|Oo 栈顶元素和串当前元素的可能情况
            if(!st.empty()&&st.top()==s[i]&&s[i]=='o')
            {
                st.pop();
                if(!st.empty()&&st.top()=='O')//肯定是大O?这地方不加判空出错
                    st.pop();//注意oo变成O不一定要push一个O进去,出错点
                else
                    st.push('O');
            }
            else if(!st.empty()&&st.top()==s[i]&&s[i]=='O')
            {
                st.pop();
            }
            else
                st.push(s[i]);
        }
        while(!st.empty())//将栈里剩余的弹出至str中
        {
            str+=st.top();
            st.pop();
        }
        for(int i=(int)str.length()-1;i>=0;i--)//逆序输出str
            cout<<str[i];
        cout<<endl;
    }
    return 0;
}