#include <bits/stdc++.h>
using namespace std;
int dX[] = {-1, 0, 1, 0, -1, 1, 1, -1};
int dY[] = {0, 1, 0, -1, 1, 1, -1, -1};
inline void Refresh() {}
bool dp[2][10007];
set<string> ans;
int main() {
  string a;
  cin >> a;
  dp[0][a.size() - 2] = true;
  dp[1][a.size() - 3] = true;
  if (a.size() - 2 >= 5) ans.insert(a.substr(a.size() - 2));
  if (a.size() - 3 >= 5) ans.insert(a.substr(a.size() - 3));
  for (int i = a.size() - 4; i >= 5; --i) {
    if (a.substr(i, 2) != a.substr(i + 2, 2) && (dp[0][i + 2])) {
      dp[0][i] = true;
      ans.insert(a.substr(i, 2));
    }
    if (dp[1][i + 2]) {
      dp[0][i] = true;
      ans.insert(a.substr(i, 2));
    }
    if (a.substr(i, 3) != a.substr(i + 3, 3) && (dp[1][i + 3])) {
      dp[1][i] = true;
      ans.insert(a.substr(i, 3));
    }
    if (dp[0][i + 3]) {
      dp[1][i] = true;
      ans.insert(a.substr(i, 3));
    }
  }
  cout << ans.size() << endl;
  for (auto it = ans.begin(); it != ans.end(); ++it) {
    cout << *it << endl;
  }
  return 0;
}
