#include <bits/stdc++.h>
using namespace std;
const int C = 26, N_MAX = 2e5;
int t, n, a[N_MAX], sum[N_MAX];
string s;
int db[C];
list<int>::iterator lst[C];
list<int> L;
vector<pair<int, int>> sol;
void upd(int pos, int dif) {
  for (; pos < n; pos |= pos + 1) sum[pos] += dif;
}
int query(int pos) {
  int res = 0;
  for (; pos > 0; pos &= pos - 1) res += sum[pos - 1];
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> t;
  while (t--) {
    cin >> s;
    n = s.length();
    for (int i = 0; i < n; i++) a[i] = s[i] - 'a';
    for (int c = 0; c < C; c++) db[c] = 0;
    for (int i = 0; i + 1 < n; i++) {
      if (a[i] == a[i + 1]) {
        db[a[i]]++;
        L.push_back(i);
        lst[a[i]] = L.end();
        --lst[a[i]];
      }
    }
    sol.clear();
    while (!L.empty()) {
      int c = 0;
      for (int i = 1; i < C; i++)
        if (db[i] > db[c]) c = i;
      if (db[c] == L.size()) {
        sol.push_back({*lst[c] + 1, *lst[c] + 1});
        db[c]--;
        if (db[c]) --lst[c];
        L.pop_back();
        continue;
      }
      list<int>::iterator it[2];
      it[0] = it[1] = lst[c];
      ++it[1];
      if (it[1] == L.end()) {
        for (int d = 0; d < C; d++) {
          if (db[d] == 0) continue;
          it[0] = it[1] = lst[d];
          ++it[1];
          if (it[1] != L.end() && a[*it[1]] == c) break;
        }
      }
      for (int i = 0; i < 2; i++) {
        c = a[*it[i]];
        --db[c];
        if (db[c] && lst[c] == it[i]) {
          --lst[c];
          while (!(a[*lst[c]] == c && a[*lst[c] + 1] == c)) --lst[c];
        }
      }
      sol.push_back({*it[0] + 1, *it[1]});
      L.erase(it[0]);
      L.erase(it[1]);
    }
    for (int i = 0; i < n; i++) sum[i] = 0;
    for (int i = 0; i < n; i++) upd(i, 1);
    cout << sol.size() + 1 << "\n";
    for (auto& [x, y] : sol) {
      int l = query(x), r = query(y);
      cout << l + 1 << " " << r + 1 << "\n";
      upd(y, -(r - l + 1));
    }
    cout << "1 " << query(n) << "\n";
  }
  return 0;
}
