#include <bits/stdc++.h>
using namespace std;
class SparseTable {
 public:
  int N;
  vector<int> compute;
  vector<vector<int>> tab;
  int merge(const int& a, const int& b) { return min(a, b); }
  SparseTable(const vector<int>& values) {
    int N = values.size();
    compute.resize(N + 1);
    for (int i = 2; i <= N; ++i) compute[i] = compute[i / 2] + 1;
    const int log = 32 - __builtin_clz(N);
    tab.resize(log);
    tab[0] = values;
    for (int j = 1; j < log; ++j) {
      tab[j].resize(N - (1 << j) + 1);
      for (int i = 0; i <= N - (1 << j); ++i)
        tab[j][i] = merge(tab[j - 1][i], tab[j - 1][i + (1 << (j - 1))]);
    }
  }
  int query(int L, int R) {
    int j = compute[R - L + 1];
    return merge(tab[j][L], tab[j][R - (1 << j) + 1]);
  }
};
int score(char ch) { return (ch == '(' ? 1 : -1); }
ostream& operator<<(ostream& stream, const vector<int>& v) {
  for (auto x : v) stream << x << " ";
  return stream;
}
int beauty(string S) {
  int N = S.size();
  vector<int> pref(N);
  for (int i = 0; i < N; ++i) pref[i] = (i > 0 ? pref[i - 1] : 0) + score(S[i]);
  if (pref.back() != 0) return 0;
  SparseTable st(pref);
  int res = 0;
  for (int i = 0; i < N; ++i) {
    int sub = (i > 0 ? pref[i - 1] : 0);
    if (i == 0) {
      int mn = st.query(i, N - 1) - sub;
      res += mn >= 0;
    } else {
      if (st.query(0, i - 1) + pref.back() - sub >= 0) {
        int mn = st.query(i, N - 1) - sub;
        res += mn >= 0;
      }
    }
  }
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int N;
  cin >> N;
  string S;
  cin >> S;
  int max_beauty = -1, in0 = -1, in1 = -1;
  for (int i = 0; i < N; ++i) {
    for (int j = i; j < N; ++j) {
      string T = S;
      swap(T[i], T[j]);
      int candidate = beauty(T);
      if (candidate > max_beauty) {
        max_beauty = candidate;
        in0 = i, in1 = j;
      }
    }
  }
  cout << max_beauty << '\n' << ++in0 << " " << ++in1 << '\n';
}
