#include <bits/stdc++.h>
using namespace std;
const int maxN = 10005, MOD = 1e7 + 7, eps = 1e-7;
int dp2[maxN], dp3[maxN];
string str;
string range(int l, int step) { return str.substr(l, step); }
set<string> S;
bool check2(int n) {
  if (n < 3) {
    return true;
  }
  return range(n - 3, 2) != range(n - 1, 2);
}
bool check3(int n) {
  if (n < 5) {
    return true;
  }
  return range(n - 5, 3) != range(n - 2, 3);
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> str;
  int n = str.length();
  reverse((str).begin(), (str).end());
  if (n > 6) {
    dp2[1] = 1;
    if (n > 7) dp3[2] = 1;
  }
  for (int i = int(2); i < int(n - 5); i++) {
    if (dp3[max(0, i - 2)]) {
      dp2[i] = 1;
    } else if (i > 2) {
      dp2[i] = check2(i) && dp2[i - 2];
    } else {
      dp2[i] = 0;
    }
    if (i == 2)
      dp3[i] = 1;
    else if (dp2[max(0, i - 3)]) {
      dp3[i] = 1;
    } else if (i > 4) {
      dp3[i] = check3(i) && dp3[i - 3];
    } else {
      dp3[i] = 0;
    }
  }
  for (int i = int(0); i < int(n); i++) {
    if (dp2[i]) {
      string aux = range(i - 1, 2);
      reverse((aux).begin(), (aux).end());
      S.insert(aux);
    }
    if (dp3[i]) {
      string aux = range(i - 2, 3);
      reverse((aux).begin(), (aux).end());
      S.insert(aux);
    }
  }
  cout << S.size() << '\n';
  for (string s : S) {
    cout << s << '\n';
  }
}
