#include <bits/stdc++.h>
using namespace std;
int best_value = 0;
void update_best(int value) {
  if (value > best_value) {
    best_value = value;
  }
}
vector<bool> a(2000000);
vector<int> minleft(1000000);
vector<int> minright(1000000);
vector<int> b(1000000);
vector<int> increasing(1000000);
vector<int> good(1000000);
int main() {
  int n = 0, z = 0;
  char t;
  for (;;) {
    if (!(cin >> t)) {
      break;
    }
    if (t == '(') {
      z++;
    } else {
      a[0] = true;
      n = 1;
      break;
    }
  }
  for (;; ++n) {
    if (!(cin >> t)) {
      break;
    }
    if (t == '(') {
      a[n] = false;
    } else {
      a[n] = true;
    }
  }
  for (int i = 0; i < z; ++i) {
    a[n] = false;
    n++;
  }
  for (int i = 0; i < n; ++i) {
    a[n + i] = a[i];
  }
  int balance = 0, min = 0;
  for (int i = 0; i < n; ++i) {
    minleft[i] = min;
    b[i] = balance;
    if (a[i] == false) {
      balance++;
    } else {
      balance--;
      if (min > balance) {
        min = balance;
      }
    }
  }
  int total = balance;
  min = balance;
  for (int i = n - 1; i >= 0; --i) {
    minright[i] = min;
    if (a[i] == false) {
      balance--;
      if (min > balance) {
        min = balance;
      }
    } else {
      balance++;
    }
  }
  balance = total;
  int incr = 0;
  for (int i = n - 1; i >= 0; --i) {
    if (a[i] == false) {
      incr++;
    } else {
      incr = 0;
    }
    increasing[i] = incr;
  }
  if (balance <= 0) {
    for (int i = 0; i < n; ++i) {
      good[i] = 0;
      if (minleft[i] == b[i] && minright[i] - balance >= b[i]) {
        update_best(increasing[i]);
        good[i] = 1;
      }
    }
  } else {
    if (minright[0] >= 0) {
      update_best(increasing[0]);
      good[0] = 1;
    }
    for (int i = 0; i < n - 1; ++i) {
      good[i + 1] = 0;
      if (minright[i] == b[i + 1] && b[i + 1] - balance <= minleft[i]) {
        update_best(increasing[i + 1]);
        good[i + 1] = 1;
      }
    }
  }
  int first = -1, second = -1;
  for (int i = 0; i < n; ++i) {
    if (increasing[i] == best_value && good[i] == 1) {
      if (first == -1) {
        first = i;
      } else if (second == -1) {
        second = i;
      }
    } else {
      good[i] = 0;
    }
  }
  if (first == -1) return 1;
  if (second != -1) {
    int len = best_value;
    while (true) {
      do {
        if (first + len == second || second + len == first) {
          break;
        }
        len++;
      } while (a[first + len] == a[second + len]);
      if (second + len == first) {
        swap(first, second);
      } else if (a[first + len] == true) {
        swap(first, second);
      }
      second += len;
      len = best_value;
      while (second < n && (good[second] == 0 || second == first)) {
        second++;
      }
      if (second >= n) {
        break;
      }
    }
  }
  int best_position = first;
  if (balance <= 0) {
    for (int i = 0; i < -balance; ++i) {
      cout << "(";
    }
  }
  for (int i = best_position; i < n; ++i) {
    cout << (a[i] == false ? "(" : ")");
  }
  for (int i = 0; i < best_position; ++i) {
    cout << (a[i] == false ? "(" : ")");
  }
  if (balance > 0) {
    for (int i = 0; i < balance; ++i) {
      cout << ")";
    }
  }
  return 0;
}
