#include <bits/stdc++.h>
using namespace std;
struct num {
  static const int MA = (int)1e9 + 7, MB = (int)1e9 + 9;
  int a, b;
  num() {}
  num(int x) : a(x), b(x) {}
  num(int _a, int _b) : a(_a), b(_b) {}
  num operator+(const num &x) const {
    return num((a + x.a) % MA, (b + x.b) % MB);
  }
  num operator-(const num &x) const {
    return num((a + MA - x.a) % MA, (b + MB - x.b) % MB);
  }
  num operator*(const num &x) const {
    return num(((long long)a * x.a) % MA, ((long long)b * x.b) % MB);
  }
  bool operator==(const num &x) const { return a == x.a && b == x.b; }
  explicit operator long long() const { return (long long)a * MB + b + 1; }
};
struct StrComparator {
  static const num P;
  static vector<num> deg;
  int n;
  const char *s;
  num *h;
  StrComparator(int n, const char *s) : n(n), s(s) {
    h = new num[n + 1];
    h[0] = 0;
    for (int i = 0; i < (int)(n); i++) h[i + 1] = h[i] * P + s[i];
    deg.reserve(n);
    while ((int)(deg).size() <= n) deg.push_back(*deg.rbegin() * P);
  }
  num substr(int i, int len) const { return h[i + len] - h[i] * deg[len]; }
  int lcp(int i, int j) {
    int L = 0, R = n - max(i, j);
    while (L < R) {
      int M = (L + R + 1) / 2;
      if (substr(i, M) == substr(j, M))
        L = M;
      else
        R = M - 1;
    }
    return L;
  }
  int cmp(int a, int b) {
    int LEN = n - max(a, b), L = lcp(a, b);
    return L < LEN ? (int)s[a + L] - s[b + L] : b - a;
  }
  bool operator()(int i, int j) { return cmp(i, j) < 0; }
};
const num StrComparator::P = num(239017, 17239);
vector<num> StrComparator::deg(1, 1);
template <const int maxN>
struct RMQ {
  int qst, qen, q[maxN], ind[maxN];
  void pop(int i) {
    if (ind[qst] == i) qst++;
  }
  void push(int i, int f) {
    while (qst < qen && q[qen - 1] >= f) qen--;
    q[qen] = f, ind[qen++] = i;
  }
  int get_min() { return q[qst]; }
};
const int N = 1e6;
int n, b[2 * N + 1];
char s[2 * N];
RMQ<2 * N> rmq;
int main() {
  gets(s), n = strlen(s);
  memcpy(s + n, s, n);
  for (int i = 0; i < (int)(2 * n); i++)
    b[i + 1] = b[i] + (s[i] == '(' ? 1 : -1);
  StrComparator h(2 * n, s);
  int ind = -1;
  for (int i = 0; i < (int)(n); i++) rmq.push(i, b[i]);
  for (int i = 0; i < (int)(n); i++) {
    rmq.push(i + n, b[i + n]);
    int mi = rmq.get_min() - b[i];
    int diff = b[n + i] - b[i];
    rmq.pop(i);
    bool good = (diff - 2 * mi == abs(b[n]));
    if (good && (ind == -1 || h.cmp(i, ind) < 0)) ind = i;
  }
  assert(ind != -1);
  if (b[n] < 0) {
    for (int i = 0; i < (int)(-b[n]); i++) putchar('(');
    for (int i = 0; i < (int)(n); i++) putchar(s[ind + i]);
  } else {
    for (int i = 0; i < (int)(n); i++) putchar(s[ind + i]);
    for (int i = 0; i < (int)(b[n]); i++) putchar(')');
  }
  return 0;
}
