#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int N = 710;
string s;
int n, t[N];
stack<int> st;
struct node {
  long long f[3][3];
  void init() {
    for (int i = 1; i <= 2; i++) f[i][0] = f[0][i] = 1;
  }
  node() { memset(f, 0, sizeof(f)); }
  void mergein(node t) {
    for (int i = 0; i <= 2; i++)
      for (int j = 0; j <= 2; j++)
        if ((i == 0 || j == 0) && i != j)
          for (int i1 = 0; i1 <= 2; i1++)
            for (int j1 = 0; j1 <= 2; j1++)
              if ((i1 != i || i1 + i == 0) && (j1 != j || j1 + j == 0))
                f[i][j] = (f[i][j] + t.f[i1][j1]) % MOD;
  }
  void mergenear(node x, node y) {
    for (int i = 0; i <= 2; i++)
      for (int j = 0; j <= 2; j++)
        for (int i1 = 0; i1 <= 2; i1++)
          for (int j1 = 0; j1 <= 2; j1++)
            if (i1 != j1 || i1 + j1 == 0)
              f[i][j] = (f[i][j] + (x.f[i][i1] * y.f[j1][j]) % MOD) % MOD;
  }
};
node DAC(int l, int r) {
  node tmp;
  if (t[l] == r) {
    if (l == r - 1)
      tmp.init();
    else
      tmp.mergein(DAC(l + 1, r - 1));
  } else
    tmp.mergenear(DAC(l, t[l]), DAC(t[l] + 1, r));
  return tmp;
}
void prepare() {
  cin >> s;
  n = s.length();
}
void solve() {
  for (int i = 1; i <= n; i++)
    if (s[i - 1] == '(')
      st.push(i);
    else
      t[i] = st.top(), st.pop(), t[t[i]] = i;
  node ans = DAC(1, n);
  long long way = 0;
  for (int i = 0; i <= 2; i++)
    for (int j = 0; j <= 2; j++) way = (way + ans.f[i][j]) % MOD;
  cout << way;
}
int main() {
  prepare();
  solve();
}
