#include <bits/stdc++.h>
using namespace std;
int n;
char s[705];
int st[705], top = 0;
int p[705], f[705];
int memo[705][705][3][3];
int dfs(int l, int r, int i, int j) {
  if (l >= r - 1) return 1;
  if (memo[l][r][i][j] != -1) return memo[l][r][i][j];
  int ans = 0;
  if (p[r] == l) {
    for (int i1 = 0; i1 < 3; i1++) {
      for (int j1 = 0; j1 < 3; j1++) {
        if (p[r - 1] == l + 1 && i1 > 0 && j1 > 0) continue;
        if (p[r - 1] == l + 1 && !i1 && !j1) continue;
        if (i1 > 0 && i1 == i || j1 > 0 && j1 == j) continue;
        ans = (ans + dfs(l + 1, r - 1, i1, j1)) % int(1e9 + 7);
      }
    }
  } else {
    int k = p[r];
    for (int i1 = 0; i1 < 3; i1++) {
      if (i1 > 0 && j > 0) continue;
      if (!i1 && !j) continue;
      for (int j1 = 0; j1 < 3; j1++) {
        if (f[l] == k - 1 && i > 0 && j1 > 0) continue;
        if (f[l] == k - 1 && !i && !j1) continue;
        if (i1 && i1 == j1) continue;
        ans = (ans + (long long)dfs(l, k - 1, i, j1) * dfs(k, r, i1, j)) %
              int(1e9 + 7);
      }
    }
  }
  return memo[l][r][i][j] = ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin >> s + 1;
  n = strlen(s + 1);
  for (int i = 1; i <= n; i++) {
    if (s[i] == '(')
      st[++top] = i;
    else {
      p[i] = st[top];
      f[st[top]] = i;
      --top;
    }
  }
  memset(memo, -1, sizeof(memo));
  int ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (p[n] == 1 && i > 0 && j > 0) continue;
      if (p[n] == 1 && !i && !j) continue;
      ans = (ans + dfs(1, n, i, j)) % int(1e9 + 7);
    }
  }
  cout << ans << endl;
  return 0;
}
