#include <bits/stdc++.h>
using namespace std;
const int N = 2000005;
const int MOD = 100000009;
const int B = 31337;
int n;
int off = 1;
int lo, hi;
char S[N];
pair<int, int> T[4 * N];
long long H[N];
long long PW[N];
void load() {
  scanf("%s", S);
  n = strlen(S);
  while (off < 2 * n) off <<= 1;
  for (int i = n; i < 2 * n; i++) S[i] = S[i - n];
  H[0] = S[0];
  for (int i = 1; i < 2 * n; i++) H[i] = H[i - 1] * B + S[i], H[i] %= MOD;
  PW[0] = 1;
  for (int i = 1; i < N; i++) PW[i] = PW[i - 1] * B, PW[i] %= MOD;
}
long long get(int first, int second) {
  if (!first) return H[second];
  return (H[second] - (H[first - 1] * PW[second - first + 1] % MOD) + MOD) %
         MOD;
}
int lcp(int first, int second) {
  int low = 0, high = 2 * n - max(first, second) - 1, middle;
  while (low <= high) {
    middle = (low + high) / 2;
    if (get(first, first + middle) != get(second, second + middle))
      high = middle - 1;
    else
      low = middle + 1;
  }
  return S[first + low] < S[second + low];
}
pair<int, int> merge(pair<int, int> A, pair<int, int> B) {
  pair<int, int> C;
  int brackets = min(A.first, B.second);
  C.first = A.first + B.first - brackets;
  C.second = A.second + B.second - brackets;
  return C;
}
pair<int, int> query(int a, int b, int node) {
  if (a > hi || b < lo) return make_pair(0, 0);
  if (a >= lo && b <= hi) return T[node];
  return merge(query(a, (a + b) / 2, node * 2),
               query((a + b) / 2 + 1, b, node * 2 + 1));
}
void solve() {
  for (int i = 0; i < 2 * n; i++) {
    if (S[i] == '(')
      T[i + off].first++;
    else
      T[i + off].second++;
  }
  for (int i = off - 1; i >= 1; i--) {
    T[i] = merge(T[i * 2], T[i * 2 + 1]);
  }
  int sol = (1 << 30);
  int sol_left = 0;
  int sol_right = 0;
  int idx = 0;
  for (int i = 0; i < n; i++) {
    lo = i, hi = i + n - 1;
    pair<int, int> AA = query(0, off - 1, 1);
    int curr = AA.first + AA.second;
    if (curr < sol) {
      sol = curr;
      sol_left = AA.first;
      sol_right = AA.second;
      idx = i;
    } else if (curr == sol && lcp(i, idx)) {
      sol_left = AA.first;
      sol_right = AA.second;
      idx = i;
    }
  }
  for (int i = 0; i < sol_right; i++) printf("(");
  for (int i = idx; i < idx + n; i++) printf("%c", S[i]);
  for (int i = 0; i < sol_left; i++) printf(")");
  printf("\n");
}
int main(void) {
  load();
  solve();
  return 0;
}
