#include <bits/stdc++.h>
using namespace std;
const int Inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
char s[200005];
int n, m;
vector<pair<int, int> > stk, si;
int cnt[26], ccn[200005];
int all, lns, mxn, ptr;
void inline jan1(int p) {
  --ccn[cnt[p]];
  --cnt[p];
  --all;
  ++ccn[cnt[p]];
}
void append_stk(int now, bool rem) {
  if (rem) {
    jan1(stk.back().second);
    jan1(si[now].second);
    printf("%d %d\n", ptr + 1, ptr + si[now].first);
    while (mxn && !ccn[mxn]) --mxn;
    ptr -= stk.back().first;
    if (now + 1 < m) {
      si[now + 1].first += stk.back().first;
    } else {
      lns += stk.back().first;
    }
    stk.pop_back();
  } else {
    stk.push_back(si[now]);
    ptr += si[now].first;
  }
}
void solve() {
  scanf("%s", s);
  n = strlen(s);
  int lst = 0;
  all = 0;
  for (int i = 1; i <= (n - 1); ++i) {
    if (s[i] == s[i - 1]) {
      ++cnt[s[i] - 'a'];
      ++all;
      si.emplace_back(i - lst, s[i] - 'a');
      lst = i;
    }
  }
  lns = n - lst;
  ptr = 0;
  m = ((int)(si).size());
  mxn = 0;
  for (int i = 0; i < (26); ++i) {
    ++ccn[cnt[i]];
    mxn = max(mxn, cnt[i]);
  }
  printf("%d\n", max(mxn, (all + 1) / 2) + 1);
  if (mxn * 2 < all) {
    for (int i = 0; i < (m); ++i)
      append_stk(i, ((int)(stk).size()) && si[i].second != stk.back().second &&
                        mxn * 2 < all);
    si = stk;
    m = ((int)(si).size());
    stk.clear();
  }
  int ch = -1;
  ptr = 0;
  for (int i = 0; i < (26); ++i)
    if (cnt[i] == mxn) ch = i;
  for (int i = 0; i < (m); ++i)
    append_stk(i, ((int)(stk).size()) &&
                      ((stk.back().second == ch) ^ (si[i].second == ch)));
  for (int i = 0; i < (((int)(stk).size())); ++i)
    printf("1 %d\n", stk[i].first);
  printf("1 %d\n", lns);
  si.clear();
  stk.clear();
  all = lns = mxn = ptr = 0;
  memset(cnt, 0, sizeof(cnt));
  memset(ccn, 0, sizeof(int) * (n + 5));
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) solve();
  return 0;
}
