#include <bits/stdc++.h>
using namespace std;
const int maxn = 710;
int n, nxt[maxn], dp[maxn][maxn][3][3];
bool vis[maxn][maxn];
char str[maxn];
const int Mod = 1000000007;
void dfs(int l, int r) {
  if (l + 1 == r) {
    dp[l][r][0][1] = dp[l][r][0][2] = dp[l][r][1][0] = dp[l][r][2][0] = 1;
    return;
  } else if (nxt[l] == r) {
    dfs(l + 1, r - 1);
    for (register int i = 0; i <= 2; i++) {
      for (register int j = 0; j <= 2; j++) {
        if (j != 1)
          dp[l][r][0][1] += dp[l + 1][r - 1][i][j], dp[l][r][0][1] %= Mod;
        if (j != 2)
          dp[l][r][0][2] += dp[l + 1][r - 1][i][j], dp[l][r][0][2] %= Mod;
        if (i != 1)
          dp[l][r][1][0] += dp[l + 1][r - 1][i][j], dp[l][r][1][0] %= Mod;
        if (i != 2)
          dp[l][r][2][0] += dp[l + 1][r - 1][i][j], dp[l][r][2][0] %= Mod;
      }
    }
  } else {
    dfs(l, nxt[l]);
    dfs(nxt[l] + 1, r);
    for (register int p1 = 0; p1 <= 2; p1++)
      for (register int p2 = 0; p2 <= 2; p2++)
        for (register int q1 = 0; q1 <= 2; q1++)
          for (register int q2 = 0; q2 <= 2; q2++) {
            if ((p2 == 1 && q1 == 1) || (p2 == 2 && q1 == 2)) continue;
            dp[l][r][p1][q2] =
                (1ll * dp[l][r][p1][q2] +
                 1ll * dp[l][nxt[l]][p1][p2] * dp[nxt[l] + 1][r][q1][q2]) %
                Mod;
          }
  }
}
stack<int> stk;
int main() {
  scanf("%s", str + 1);
  n = strlen(str + 1);
  for (register int i = 1; i <= n; i++) {
    if (str[i] == '(')
      stk.push(i);
    else
      nxt[stk.top()] = i, stk.pop();
  }
  dfs(1, n);
  int answer = 0;
  for (register int i = 0; i <= 2; i++)
    for (register int j = 0; j <= 2; j++)
      answer = (1ll * answer + 1ll * dp[1][n][i][j]) % Mod;
  printf("%d\n", answer);
  return 0;
}
