#include <bits/stdc++.h>
int diru[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dirv[] = {-1, 0, 1, -1, 1, -1, 0, 1};
using namespace std;
template <class T>
T sq(T n) {
  return n * n;
}
template <class T>
T gcd(T a, T b) {
  return (b != 0 ? gcd<T>(b, a % b) : a);
}
template <class T>
T lcm(T a, T b) {
  return (a / gcd<T>(a, b) * b);
}
template <class T>
bool inside(T a, T b, T c) {
  return a <= b && b <= c;
}
template <class T>
void setmax(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
void setmin(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
T power(T N, T P) {
  return (P == 0) ? 1 : N * power(N, P - 1);
}
int dp[705][705][3][3];
bool isV[705][705][3][3];
int n;
char in[1000];
int pre[1000];
int tmp[1000];
long long unsigned M = 1000000007;
long long unsigned cal(int i, int j, int a, int b) {
  if (i > j) return 1;
  if (isV[i][j][a][b]) return dp[i][j][a][b];
  long long unsigned ret = 0, tmp;
  if (pre[i] == j) {
    if (a && b) {
      if (a != b) {
        if (a == 1) {
          ret += cal(i + 1, j - 1, 2, 0);
          ret += cal(i + 1, j - 1, 0, 1);
          ret %= M;
        } else {
          ret += cal(i + 1, j - 1, 1, 0);
          ret += cal(i + 1, j - 1, 0, 2);
          ret %= M;
        }
      } else {
        if (a == 1) {
          ret += cal(i + 1, j - 1, 2, 0);
          ret += cal(i + 1, j - 1, 0, 2);
          ret %= M;
        } else {
          ret += cal(i + 1, j - 1, 1, 0);
          ret += cal(i + 1, j - 1, 0, 1);
          ret %= M;
        }
      }
    } else {
      if (a == 0 && b == 0) {
        ret += cal(i + 1, j - 1, 1, 0);
        ret += cal(i + 1, j - 1, 0, 1);
        ret %= M;
        ret += cal(i + 1, j - 1, 2, 0);
        ret %= M;
        ret += cal(i + 1, j - 1, 0, 2);
        ret %= M;
      } else if (a) {
        if (a == 1) {
          ret += cal(i + 1, j - 1, 2, 0);
          ret += cal(i + 1, j - 1, 0, 2);
          ret %= M;
          ret += cal(i + 1, j - 1, 0, 1);
          ret %= M;
        } else {
          ret += cal(i + 1, j - 1, 1, 0);
          ret += cal(i + 1, j - 1, 0, 1);
          ret %= M;
          ret += cal(i + 1, j - 1, 0, 2);
          ret %= M;
        }
      } else {
        if (b == 1) {
          ret += cal(i + 1, j - 1, 2, 0);
          ret += cal(i + 1, j - 1, 0, 2);
          ret %= M;
          ret += cal(i + 1, j - 1, 1, 0);
          ret %= M;
        } else {
          ret += cal(i + 1, j - 1, 1, 0);
          ret += cal(i + 1, j - 1, 0, 1);
          ret %= M;
          ret += cal(i + 1, j - 1, 2, 0);
          ret %= M;
        }
      }
    }
  } else {
    if (a == 0) {
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 1, 0) *
             (long long unsigned)cal(pre[i] + 1, j, 0, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 2, 0) *
             (long long unsigned)cal(pre[i] + 1, j, 0, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 0, 1) *
             (long long unsigned)cal(pre[i] + 1, j, 1, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 0, 2) *
             (long long unsigned)cal(pre[i] + 1, j, 2, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
    } else if (a == 1) {
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 2, 0) *
             (long long unsigned)cal(pre[i] + 1, j, 0, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 0, 1) *
             (long long unsigned)cal(pre[i] + 1, j, 1, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 0, 2) *
             (long long unsigned)cal(pre[i] + 1, j, 2, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
    } else {
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 1, 0) *
             (long long unsigned)cal(pre[i] + 1, j, 0, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 0, 1) *
             (long long unsigned)cal(pre[i] + 1, j, 1, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
      tmp = ((long long unsigned)cal(i + 1, pre[i] - 1, 0, 2) *
             (long long unsigned)cal(pre[i] + 1, j, 2, b)) %
            (long long unsigned)M;
      ret += tmp;
      ret %= M;
    }
  }
  isV[i][j][a][b] = 1;
  return dp[i][j][a][b] = ret;
}
int main() {
  int T, t = 1, m, i, j, k;
  while (scanf("%s", in) == 1) {
    n = strlen(in);
    int cur = 2;
    for (i = 0; i < n; i++) {
      if (in[i] == '(') {
        cur++;
        tmp[cur] = i;
      } else {
        cur--;
        pre[i] = tmp[cur + 1];
        pre[pre[i]] = i;
      }
    }
    cout << cal(0, n - 1, 0, 0) << endl;
  }
  return 0;
}
