rt.
#include<bits/stdc++.h>
using namespace std;
#define reg register
inline void work();
int main(){
work();
return 0;
}
//End of MAIN
const int N=701,mod=1e9+7;
int n,match[N];
long long dp[N][N][3][3];
char str[N];
stack<int>S;
void dfs(int l,int r){
if(l+1==r){dp[l][r][0][1]=dp[l][r][0][2]=dp[l][r][1][0]=dp[l][r][2][0]=1;return;}
dfs(l+1,r-1);
if(match[l]==r){
for(reg int i=0;i<3;++i)
for(reg int j=0;j<3;++j)
j!=1&&(dp[l][r][0][1]=(dp[l][r][0][1]+dp[l+1][r-1][i][j])%mod),
j!=2&&(dp[l][r][0][2]=(dp[l][r][0][2]+dp[l+1][r-1][i][j])%mod),
i!=1&&(dp[l][r][1][0]=(dp[l][r][1][0]+dp[l+1][r-1][i][j])%mod),
i!=2&&(dp[l][r][2][0]=(dp[l][r][2][0]+dp[l+1][r-1][i][j])%mod);
return;
}
dfs(l,match[l]),dfs(match[l]+1,r);
for(reg int i=0;i<3;++i)
for(reg int j=0;j<3;++j)
for(reg int p=0;p<3;++p)
for(reg int q=0;q<3;++q)
(j==1&&p==1)||(j==2&&p==2)||(
dp[l][r][i][q]=(dp[l][r][i][q]+dp[l][match[l]][i][j]*dp[match[l]+1][r][p][q])%mod
);
}
inline void work(){
scanf("%s",str+1),n=strlen(str+1);
for(reg int i=1;i<=n;++i)
str[i]=='('?S.push(i):(match[S.top()]=i,match[i]=S.top(),S.pop());
dfs(1,n);
reg long long ans=0;
for(reg int i=0;i<3;++i)
for(reg int j=0;j<3;++j)
ans=(ans+dp[1][n][i][j])%mod;
printf("%lld",ans);
}