#include <bits/stdc++.h>
int const MAX = 1e5 + 5;
char s[MAX];
int next[MAX];
int len, pos, num;
int l[MAX], cnt[MAX], re[MAX];
void get_next() {
  int i = 0, j = -1;
  next[0] = -1;
  while (s[i] != '\0') {
    if (j == -1 || s[i] == s[j]) {
      i++;
      j++;
      next[i] = j;
    } else
      j = next[j];
  }
}
void solve() {
  for (int i = 0; i <= len; i++) re[i] = 1;
  for (int i = len; i >= 1; i--)
    if (next[i] != -1) re[next[i]] += re[i];
  int pos = len;
  while (pos) {
    cnt[num] = re[pos];
    l[num++] = pos;
    pos = next[pos];
  }
}
int main() {
  scanf("%s", s);
  len = strlen(s);
  get_next();
  solve();
  printf("%d\n", num);
  for (int i = num - 1; i >= 0; i--) printf("%d %d\n", l[i], cnt[i]);
}
