#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
using namespace std;
int solve();
int main() { solve(); }
const int inf = (int)1e9 + 7;
const int dd = (int)2e6 + 7;
int cnt[2 * dd], P[dd], S[dd], B[dd], n;
char SS[2 * dd];
string s;
pair<int, int> T[dd];
int C[dd], A[dd], W[dd];
pair<pair<int, int>, int> J[dd], cp[dd];
int cur[dd];
unsigned int mod, mod2, p = 3;
unsigned int P1[dd], H[dd];
unsigned int P2[dd], H2[dd];
struct MyHash {
  string S;
  MyHash(string s, int t, int t2) {
    S = s;
    mod = t, mod2 = t2, P1[0] = P2[0] = 1;
    for (int i = 0; i + 1 < dd; i++) P1[i + 1] = P1[i] * p % mod;
    for (int i = 0; i + 1 < dd; i++) P2[i + 1] = P2[i] * p % mod2;
    for (int i = 0; i < (int)s.size(); i++)
      H[i + 1] = (H[i] * p + (s[i] == ')' ? 1 : 2)) % mod;
    for (int i = 0; i < (int)s.size(); i++)
      H2[i + 1] = (H2[i] * p + (s[i] == ')' ? 1 : 2)) % mod2;
  }
  int get(int l, int len) {
    int t = (H[l + len] - H[l] * P1[len]) % mod;
    return (t < 0 ? t + mod : t);
  }
  int get2(int l, int len) {
    int t = (H2[l + len] - H2[l] * P2[len]) % mod;
    return (t < 0 ? t + mod : t);
  }
  int check(int i, int j) {
    int l = 0, r = n;
    while (r - l > 1) {
      int m = (l + r) / 2;
      if (get(i, m) == get(j, m) && get2(i, m) == get2(j, m))
        l = m;
      else
        r = m;
    }
    return S[i + l] < S[j + l];
  }
};
inline void my_sort() {
  memset(cur, 0, sizeof(int) * (n + 1));
  copy(J, J + n, cp);
  for (int i = 0; i < n; ++i) cur[cp[i].first.first + 1]++;
  for (int i = 1; i <= n; ++i) cur[i] += cur[i - 1];
  for (int i = 0; i < n; ++i) J[cur[cp[i].first.first]++] = cp[i];
}
inline int check(int x) { return x < 0 ? x + n : x; }
inline void build() {
  for (int i = 0; i < n; i++) {
    T[i] = {s[i], i};
  }
  sort(T, T + n);
  int c = -1;
  for (int i = 0; i < n; i++) {
    if (!i || T[i - 1].first != T[i].first) c++;
    C[T[i].second] = c;
    A[i] = T[i].second;
  }
  for (int L = 1; L < n; L *= 2) {
    for (int i = 0; i < n; i++) {
      int j = A[i];
      J[i] = {{C[check(A[i] - L)], C[A[i]]}, check(A[i] - L)};
    }
    my_sort();
    int c = -1;
    for (int i = 0; i < n; i++) {
      if (!i || J[i - 1].first != J[i].first) c++;
      C[J[i].second] = c;
      A[i] = J[i].second;
    }
  }
  for (int i = 0; i < n; i++) W[A[i]] = i;
}
inline int get(int i, int j) {
  if (i >= n) i -= n;
  if (j >= n) j -= n;
  return W[i] < W[j];
}
int solve() {
  cin >> s;
  n = (int)s.size();
  if (s.find(")") == -1 || s.find("(") == -1) {
    cout << string(n, '(') + string(n, ')');
    return 0;
  }
  build();
  s += s;
  copy(s.begin(), s.end(), SS);
  n <<= 1;
  for (int i = n - 1; i >= 0; i--) {
    if (s[i] == ')')
      cnt[i] = 0;
    else
      cnt[i] = cnt[i + 1] + 1;
  }
  n >>= 1;
  int pos = -1, c = -1, len = inf, Q;
  for (int i = 0; i < n; i++) {
    B[i + 1] = B[i] + (s[i] == '(' ? 1 : -1);
    P[i + 1] = min(P[i], B[i + 1]);
  }
  S[n] = B[n];
  for (int i = n - 1; i >= 0; i--) {
    S[i] = min(S[i + 1], B[i + 1]);
  }
  for (int i = 0; i < n; i++) {
    if ((i ? s[i - 1] : s[n - 1]) == '(' || s[i] == ')') continue;
    int cur = B[n] - B[i];
    int q = min(S[i] - B[i], P[i] + cur);
    q = min(q, 0);
    q = -q;
    int curlen = q + B[n] + q;
    if (curlen == len ? (cnt[i] + q == c ? get(i, pos) : cnt[i] + q > c)
                      : curlen < len) {
      pos = i;
      c = cnt[i] + q;
      len = curlen;
      Q = q;
    }
  }
  string ans = "";
  for (int i = 0; i < Q; ++i) ans += '(';
  for (int i = pos; i < pos + n; ++i) ans += SS[i];
  for (int i = 0; i < Q + B[n]; ++i) ans += ')';
  cout << ans;
  return 0;
}
