const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
let str = await readline();
const sets = [];
let isOpen = false;
let deleteLeft = 0;
const deleteStr = [];
for (let i = 0; i < str.length; i++) {
const c = str[i];
if (c === "(") {
isOpen = true;
deleteLeft = i;
sets.push(new Set());
continue;
}
if (c === ")") {
isOpen = false;
deleteStr.push(str.slice(deleteLeft, i + 1));
deleteLeft = i + 1;
if (sets[sets.length - 1].size == 0) sets.pop();
}
if (isOpen) {
sets[sets.length - 1].add(c);
}
}
deleteStr.forEach((s) => {
str = str.replace(s, "");
});
outer: while (true) {
for (let i = 0; i < sets.length; i++) {
for (let j = i + 1; j < sets.length; j++) {
if (helper(sets[i], sets[j])) {
sets[i] = new Set([...sets[i], ...sets[j]]);
sets.splice(j, 1);
continue outer;
}
}
}
break;
}
console.log(sets);
let ans = [];
for (let i = 0; i < str.length; i++) {
const c = str[i];
for (let set of sets) {
const t = [...set].sort()[0];
if (set.has(c)) ans.push(t);
else ans.push(c);
}
}
console.log(ans.join(""));
})();
const helper = (set1, set2) => {
for (let c = 97; c <= 122; c++) {
if (
(set1.has(String.fromCharCode(c)) ||
set1.has(String.fromCharCode(c - 32))) &&
(set2.has(String.fromCharCode(c)) ||
set2.has(String.fromCharCode(c - 32)))
)
return true;
}
return false;
};