#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 400010;
long long mod = 1e9 + 7;
int len;
int rr[705];
long long dp[705][705][3][3];
char s[705];
void init() {
  memset(rr, -1, sizeof(rr));
  stack<int> st;
  for (int i = 0; i < len; i++) {
    if (s[i] == '(')
      st.push(i);
    else {
      int u = st.top();
      st.pop();
      rr[u] = i;
    }
  }
}
long long dfs(int l, int r, int lc, int rc) {
  if (l + 1 == r) {
    if (lc == 0 && rc != 0) return 1;
    if (lc != 0 && rc == 0) return 1;
    return 0;
  }
  if (dp[l][r][lc][rc] != -1) return dp[l][r][lc][rc];
  long long& ans = dp[l][r][lc][rc];
  ans = 0;
  if (rr[l] == r) {
    if (lc == 0 && rc == 0) return 0;
    if (lc != 0 && rc != 0) return 0;
    for (int i = 0; i < 3; i++) {
      if (i == lc && i) continue;
      for (int j = 0; j < 3; j++) {
        if (j == rc && j) continue;
        ans = (ans + dfs(l + 1, r - 1, i, j)) % mod;
      }
    }
  } else {
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (i == j && i) continue;
        ans = (ans + dfs(l, rr[l], lc, i) * dfs(rr[l] + 1, r, j, rc)) % mod;
      }
    }
  }
  return ans;
}
int main() {
  scanf("%s", s);
  len = strlen(s);
  init();
  memset(dp, -1, sizeof(dp));
  long long ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      ans = (ans + dfs(0, len - 1, i, j)) % mod;
    }
  }
  printf("%I64d\n", ans);
  return 0;
}
