#include <bits/stdc++.h>
using namespace std;
const int P = int(1e5) + 7;
const int MAX_N = int(1e5) + 10;
struct Answer {
  int totalLength;
  vector<pair<int, int> > v;
  Answer() {
    v.clear();
    normalize();
  }
  void normalize() {
    sort(v.begin(), v.end());
    totalLength = 0;
    for (int i = 0; i < (int)v.size(); ++i)
      totalLength += v[i].second - v[i].first + 1;
  }
  bool operator<(const Answer &o) const { return totalLength < o.totalLength; }
};
inline void update(Answer &x, const Answer &t) {
  if (x < t) x = t;
}
int n;
char input[MAX_N];
int earliest[MAX_N];
unsigned long long pPower[MAX_N], prefix[MAX_N], suffix[MAX_N];
inline unsigned long long hashValue(unsigned long long *h, int l, int r,
                                    int length) {
  return h[r] - h[l] * pPower[length];
}
int main() {
  gets(input + 1);
  n = strlen(input + 1);
  pPower[0] = 1ULL;
  for (int i = 1; i <= n; ++i) {
    pPower[i] = pPower[i - 1] * P;
    prefix[i] = prefix[i - 1] * P + input[i];
  }
  for (int i = n; i >= 1; --i) {
    suffix[i] = suffix[i + 1] * P + input[i];
  }
  for (int i = n, j = 1; i >= 1; --i) {
    int length = n - i + 1;
    for (; j <= n && (j < length || hashValue(prefix, j - length, j, length) !=
                                        hashValue(suffix, n + 1, i, length));
         j++)
      ;
    earliest[i] = j;
  }
  Answer result;
  result.normalize();
  for (int i = 1; i <= n; ++i) {
    int longest = 1, l = 2, r = min(i, n - i + 1), pos = n + 1;
    while (l <= r) {
      int mid = l + r >> 1;
      if (hashValue(prefix, i - mid, i, mid) ==
          hashValue(suffix, i + mid, i, mid))
        longest = mid, l = mid + 1;
      else
        r = mid - 1;
    }
    l = i + longest, r = n;
    while (l <= r) {
      int mid = l + r >> 1;
      if (earliest[mid] <= i - longest)
        pos = mid, r = mid - 1;
      else
        l = mid + 1;
    }
    Answer temp;
    temp.v.push_back(pair<int, int>(i - longest + 1, i + longest - 1));
    if (pos <= n) {
      temp.v.push_back(pair<int, int>(pos, n));
      temp.v.push_back(
          pair<int, int>(earliest[pos] - (n - pos), earliest[pos]));
    }
    temp.normalize();
    update(result, temp);
  }
  printf("%d\n", (int)result.v.size());
  for (int i = 0; i < (int)result.v.size(); ++i)
    printf("%d %d\n", result.v[i].first,
           result.v[i].second - result.v[i].first + 1);
}
