/*
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=500000;
int n;//|a| 
char a[N+5];//字符串 
int lcP[N+1],Lcs[N+1];//每个后缀与a的LCP、每个前缀与a的LCS 
int z[N+1];//z数组 
void z_init(){//对a跑Z算法 
	z[1]=n;
	int zl=0,zr=0;
	for(int i=2;i<=n;i++)
		if(zr<i){
			z[i]=0;
			while(i+z[i]<=n&&a[1+z[i]]==a[i+z[i]])z[i]++;
			if(z[i])zl=i,zr=i+z[i]-1;
		}
		else if(i+z[i-zl+1]<=zr)z[i]=z[i-zl+1];
		else{
			z[i]=zr-i+1;
			while(i+z[i]<=n&&a[1+z[i]]==a[i+z[i]])z[i]++;
			zl=i;zr=i+z[i]-1;
		}
}
bool Cyc[N+1],cyC[N+1]; 
int main(){
	cin>>a+1;
	n=strlen(a+1);
	bool ok=true;
	for(int i=1;i<n;i++)ok&=a[i]==a[i+1];//a的最小循环节是否为1 
	if(ok)return cout<<n<<"\n1",0;//特判最小循环节为1 
	z_init();
	for(int i=1;i<=n;i++)lcP[i]=z[i];//算lcP 
	reverse(a+1,a+n+1);//令a=a^r以算Lcs 
	z_init();
	for(int i=1;i<=n;i++)Lcs[i]=z[n-i+1];//算Lcs 
	ok=true;
	for(int i=1;i<n;i++)if(n%i==0&&lcP[i+1]==n-i)ok=false;//a是否循环 
	if(ok)return puts("1\n1"),0;//特判不循环 
	puts("2");//一定有分成2段的方式 
	for(int i=1;i<=n;i++){
		if(Cyc[i])continue;
		for(int j=2*i;j<=n;j+=i)
			if(lcP[i+1]>=j-i)Cyc[j]=true;
			else break;
	}
	for(int i=1;i<=n;i++){
		if(cyC[n-i+1])continue;
		for(int j=n-2*i+1;j>=1;j-=i)
			if(Lcs[n-i]>=n-j+1-i)cyC[j]=true;
			else break;
	}
	int ans=0;
	for(int i=1;i<n;i++)ans+=!Cyc[i]&&!cyC[i+1];
	cout<<ans;
	return 0;
}