#include <bits/stdc++.h>
using namespace std;
bool flag[710][710];
unsigned long long f[710][710][3][3];
char s[710];
stack<int> S;
int match[710];
int main() {
  scanf("%s", s + 1);
  int len = strlen(s + 1);
  for (int i = 1; i <= len; i++) {
    if (s[i] == '(')
      S.push(i);
    else
      flag[S.top()][i] = true, match[S.top()] = i, S.pop();
    f[i][i][0][0] = 1;
    f[i][i][1][1] = 1;
    f[i][i][2][2] = 1;
  }
  for (int i = 2; i <= len; i++)
    for (int j = 1; j + i - 1 <= len; j++) {
      int k = j + i - 1;
      if (flag[j][k]) {
        if (i > 2)
          for (int x = 0; x < 3; x++)
            for (int y = 0; y < 3; y++) {
              if (y != 1)
                f[j][k][0][1] =
                    (f[j][k][0][1] + f[j + 1][k - 1][x][y]) % 1000000007;
              if (y != 2)
                f[j][k][0][2] =
                    (f[j][k][0][2] + f[j + 1][k - 1][x][y]) % 1000000007;
              if (x != 1)
                f[j][k][1][0] =
                    (f[j][k][1][0] + f[j + 1][k - 1][x][y]) % 1000000007;
              if (x != 2)
                f[j][k][2][0] =
                    (f[j][k][2][0] + f[j + 1][k - 1][x][y]) % 1000000007;
            }
        else {
          f[j][k][1][0] = 1;
          f[j][k][2][0] = 1;
          f[j][k][0][1] = 1;
          f[j][k][0][2] = 1;
        }
      } else {
        int mid = match[j];
        for (int x = 0; x < 3; x++)
          for (int y = 0; y < 3; y++)
            for (int p = 0; p < 3; p++)
              for (int q = 0; q < 3; q++) {
                if (y == p && p) continue;
                f[j][k][x][q] =
                    (f[j][k][x][q] +
                     (long long)(f[j][mid][x][y] * f[mid + 1][k][p][q]) %
                         1000000007) %
                    1000000007;
              }
      }
    }
  int ans = 0;
  for (int x = 0; x < 3; x++)
    for (int y = 0; y < 3; y++) ans = (ans + f[1][len][x][y]) % 1000000007;
  printf("%d\n", ans);
  return 0;
}
