#include <bits/stdc++.h>
const int maxn = 705;
const int mod = 1e9 + 7;
using ll = long long;
ll dp[maxn][maxn][3][3];
int match[maxn];
void dfs(int x, int y) {
  if (x >= y) return;
  if (x + 1 == y && match[x] == y) {
    dp[x][y][0][1] = dp[x][y][1][0] = dp[x][y][2][0] = dp[x][y][0][2] = 1;
    return;
  } else if (match[x] == y) {
    dfs(x + 1, y - 1);
    for (int i = 0; i <= 2; ++i)
      for (int j = 0; j <= 2; ++j) {
        if (j != 1) (dp[x][y][0][1] += dp[x + 1][y - 1][i][j]) %= mod;
        if (i != 1) (dp[x][y][1][0] += dp[x + 1][y - 1][i][j]) %= mod;
        if (j != 2) (dp[x][y][0][2] += dp[x + 1][y - 1][i][j]) %= mod;
        if (i != 2) (dp[x][y][2][0] += dp[x + 1][y - 1][i][j]) %= mod;
      }
  } else {
    dfs(x, match[x]), dfs(match[x] + 1, y);
    for (int i = 0; i <= 2; ++i)
      for (int j = 0; j <= 2; ++j)
        for (int p = 0; p <= 2; ++p)
          for (int q = 0; q <= 2; ++q) {
            if ((j == 1 && p == 1) || (j == 2 && p == 2)) continue;
            (dp[x][y][i][q] +=
             dp[x][match[x]][i][j] * dp[match[x] + 1][y][p][q]) %= mod;
          }
  }
}
int st[maxn], t;
int main() {
  std::string str;
  std::cin >> str;
  int n = str.length();
  for (int i = 0; i < n; ++i) {
    if (str[i] == '(')
      st[++t] = i + 1;
    else
      match[st[t--]] = i + 1;
  }
  dfs(1, n);
  ll ans = 0;
  for (int i = 0; i <= 2; ++i)
    for (int j = 0; j <= 2; ++j) (ans += dp[1][n][i][j]) %= mod;
  printf("%lld\n", ans);
  return 0;
}
