#include <algorithm>
// #include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#include <bitset>
using namespace std;
typedef long long LL;
typedef double db;
const int oo=2139063143;
const int N=1010000;
const int P=1000000007;
const db eps=1e-7;
#define pritnf printf
//char buf[1<<22],*p1=buf,*p2=buf,obuf[1<<22],*O=obuf;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
template <typename T>
inline void sc (T &x)
{
    x=0; static int p; p=1; static char c; c=getchar();
    while (!isdigit(c)) { if (c=='-') p=-1; c=getchar(); }
    while ( isdigit(c)) { x=(x<<1)+(x<<3)+(c-48); c=getchar(); }
    x*=p;
}
template <typename T>
inline void print (T x)
{
    if (x< 0) putchar('-'),x=-x;
    if (x>=10) print(x/10);
    putchar(x%10+'0');
}
template <typename T>
inline void pr (T x) { print(x),putchar('\n'); }
template <typename T1,typename T2>
void chkmax (T1 &A,T2 B) { A=A>=B?A:B; }
template <typename T1,typename T2>
void chkmin (T1 &A,T2 B) { A=A<=B?A:B; }
int del(int x) { return x>=P?x-P:x; }
void add(int &x,int y) { x=del(x+y); }
void add3(int &x,int y) { x+=y; x=x>=3?x-3:x; }
int f[N],pre[3]={0,-1,-1};
char s[N];
int main ()
{
    // freopen (".in","r",stdin);
    // freopen (".out","w",stdout);
	scanf ("%s",s+1);
	int n=strlen (s+1); bool fg=0;
	for (int i=1; i< n; i++)
		if (s[i]==s[i+1]) { fg=1; break; }
	if (!fg) return pr(1),0;
	f[0]=1;
	for (int i=1,x=0; i<=n; i++)
	{
		add3(x,1+(s[i]=='b'));
		if (!x&&i< n) f[i]=1;
		add3(x,1); if (pre[x]!=-1) add(f[i],f[pre[x]]);
		add3(x,1); if (pre[x]!=-1) add(f[i],f[pre[x]]);
		add3(x,1),pre[x]=i;
	}
	pr(f[n]);

    return 0;
}
