#include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const int mx = 705;   long long int dp[mx][mx][3][3];   char s[mx];   int p[mx];   stack<int> st;   long long int dfs(int l, int r, int lc, int rc) {     if (l >= r) return 1;     if (dp[l][r][lc][rc] != -1) return dp[l][r][lc][rc];     int x = p[l];     int y = p[r];     dp[l][r][lc][rc] = 0;     if (x == r) {       for (int i = 1; i <= 2; i++)         if (i != rc)           dp[l][r][lc][rc] = (dp[l][r][lc][rc] + dfs(l + 1, r - 1, 0, i)) % mod;       for (int i = 1; i <= 2; i++)         if (i != lc)           dp[l][r][lc][rc] = (dp[l][r][lc][rc] + dfs(l + 1, r - 1, i, 0)) % mod;     } else if (x + 1 == y) {       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (i != lc && j != rc)             dp[l][r][lc][rc] = (dp[l][r][lc][rc] + dfs(l + 1, x - 1, i, 0) *                                                        dfs(y + 1, r - 1, 0, j)) %                                mod;       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (i != j)             dp[l][r][lc][rc] = (dp[l][r][lc][rc] + dfs(l + 1, x - 1, 0, i) *                                                        dfs(y + 1, r - 1, j, 0)) %                                mod;       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (i != lc)             dp[l][r][lc][rc] = (dp[l][r][lc][rc] + dfs(l + 1, x - 1, i, 0) *                                                        dfs(y + 1, r - 1, j, 0)) %                                mod;       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (j != rc)             dp[l][r][lc][rc] = (dp[l][r][lc][rc] + dfs(l + 1, x - 1, 0, i) *                                                        dfs(y + 1, r - 1, 0, j)) %                                mod;     } else {       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (i != lc && j != rc)             dp[l][r][lc][rc] =                 (dp[l][r][lc][rc] + dfs(l + 1, x - 1, i, 0) *                                         dfs(x + 1, y - 1, 0, 0) % mod *                                         dfs(y + 1, r - 1, 0, j)) %                 mod;       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           dp[l][r][lc][rc] = (dp[l][r][lc][rc] +                               dfs(l + 1, x - 1, 0, i) * dfs(x + 1, y - 1, i, j) %                                   mod * dfs(y + 1, r - 1, j, 0)) %                              mod;       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (i != lc)             dp[l][r][lc][rc] =                 (dp[l][r][lc][rc] + dfs(l + 1, x - 1, i, 0) *                                         dfs(x + 1, y - 1, 0, j) % mod *                                         dfs(y + 1, r - 1, j, 0)) %                 mod;       for (int i = 1; i <= 2; i++)         for (int j = 1; j <= 2; j++)           if (j != rc)             dp[l][r][lc][rc] =                 (dp[l][r][lc][rc] + dfs(l + 1, x - 1, 0, i) *                                         dfs(x + 1, y - 1, i, 0) % mod *                                         dfs(y + 1, r - 1, 0, j)) %                 mod;     }     return dp[l][r][lc][rc];   }   int main() {     memset(dp, -1, sizeof(dp));     int n;     scanf( %s , s + 1);     n = strlen(s + 1);     for (int i = 1; i <= n; i++)       if (s[i] ==  ( )         st.push(i);       else {         p[st.top()] = i;         p[i] = st.top();         st.pop();       }     long long int ans = dfs(1, n, 0, 0);     printf( %I64d n , ans);     return 0;   }