#include <bits/stdc++.h>
using namespace std;
const int N = 101010;
int n, ans;
int pa[N << 1], ns[N], nt[N], ma[N], pos[N];
vector<pair<int, int> > res;
char s[N], sr[N];
void Manacher(char *s, int n, int *pa) {
  pa[0] = 1;
  for (int i = 1, j = 0; i < (n << 1) - 1; ++i) {
    int p = i >> 1, q = i - p, r = ((j + 1) >> 1) + pa[j] - 1;
    pa[i] = r < q ? 0 : min(r - q + 1, pa[(j << 1) - i]);
    while (0 <= p - pa[i] && q + pa[i] < n && s[p - pa[i]] == s[q + pa[i]])
      pa[i]++;
    if (q + pa[i] - 1 > r) j = i;
  }
  for (int i = (0); i < (n); ++i) pa[i] = pa[i << 1];
}
void kmp(char *s, int *ns, char *t, int *nt) {
  int lens = strlen(s);
  int lent = strlen(t);
  nt[0] = -1;
  for (int i = 0, j = -1; i < lens; ++i) {
    while (j >= 0 && s[i] != t[j + 1]) j = nt[j];
    if (s[i] == t[j + 1]) ++j;
    ns[i] = j;
    if (j + 1 == lent) j = nt[j];
  }
}
int main() {
  std::ios::sync_with_stdio(0);
  std::cin.tie(0);
  cin >> s;
  n = strlen(s);
  Manacher(s, n, pa);
  for (int i = (0); i < (n); ++i) sr[i] = s[n - 1 - i];
  sr[n] = '\0';
  kmp(sr + 1, nt + 1, sr, nt);
  kmp(s, ns, sr, nt);
  for (int i = (0); i < (n); ++i)
    if (~ns[i]) ++ns[i];
  ma[0] = ns[0];
  pos[0] = 0;
  for (int i = (1); i < (n); ++i) {
    ma[i] = ma[i - 1];
    pos[i] = pos[i - 1];
    if (ma[i] < ns[i]) {
      ma[i] = ns[i];
      pos[i] = i;
    }
  }
  for (int i = (0); i < (n); ++i) {
    int k = i - pa[i];
    int t = max(0, min(k < 0 ? 0 : ma[k], n - i - pa[i]));
    int c = pa[i] * 2 - 1 + t * 2;
    if (ans < c) {
      ans = c;
      res.clear();
      res.push_back(make_pair(i - pa[i] + 1, pa[i] * 2 - 1));
      if (t) {
        res.push_back(make_pair(n - t, t));
        int o = pos[k] - 2 * ns[pos[k]] + t + 1;
        res.push_back(make_pair(o, t));
      }
    }
  }
  sort(res.begin(), res.end());
  cout << (int)res.size() << "\n";
  for (auto u : res) cout << u.first + 1 << " " << u.second << "\n";
  return 0;
}
