#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <functional>
#include <cmath>
#include <string>
#include <set>
#include <map>
#define SIZE 100005
#define MOD 1000000007

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;

char str[SIZE];
int nxt[SIZE][3];
int dp[SIZE];
int memo[3];

ll solve(vector <int> vec)
{
	int n=vec.size();
	memset(memo,-1,sizeof(memo));
	for(int i=n-1;i>=0;i--)
	{
		memo[vec[i]]=i;
		for(int t=0;t<3;t++) nxt[i][t]=memo[t];
	}
	if(memo[0]==-1||memo[1]==-1||memo[2]==-1) return 1;
	for(int i=0;i<=n;i++) dp[i]=0;
	//for(int i=0;i<n;i++) printf("%d ",vec[i]);puts("");
	dp[0]=1;
	for(int i=0;i<n;i++)
	{
		for(int t=0;t<3;t++)
		{
			if(t==vec[i]) continue;
			if(nxt[i][t]!=-1)
			{
				dp[nxt[i][t]]+=dp[i];
				if(dp[nxt[i][t]]>=MOD) dp[nxt[i][t]]-=MOD;
			}
		}
		//printf("%d\n",dp[i]);
	}
	ll ret=0;
	for(int i=1;i<n;i++)
	{
		if(vec[i]==vec[n-1])
		{
			ret+=dp[i];
			if(ret>=MOD) ret-=MOD;
		}
	}/*
	for(int i=n-4;i>=0;i-=2)
	{
		if(vec[i]==vec[i+2]&&vec[i+1]==vec[i+3])
		{
			ret-=dp[i];
			if(ret<0) ret+=MOD;
		}
		else break;
	}*/
	return ret;
}
int main()
{
	scanf("%s",&str);
	int n=strlen(str);
	int sum=0;
	vector <int> vec;
	vec.push_back(0);
	for(int i=0;i<n;i++)
	{
		if(str[i]=='a') sum+=2;
		else sum++;
		sum%=3;
		vec.push_back(sum);
	}
	//for(int i=0;i<vec.size();i++) printf("%d ",vec[i]);puts("");
	ll ret=1;
	vector <int> now;
	for(int i=0;i<vec.size();i++)
	{
		if(now.size()>=1&&now[now.size()-1]==vec[i])
		{
			ret=ret*solve(now);
			ret%=MOD;
			now.clear();
		}
		now.push_back(vec[i]);
	}
	ret=ret*solve(now);
	ret%=MOD;
	printf("%lld\n",ret);
	return 0;
}
