#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& s, vector<T>& v) {
  s << '{';
  for (int i = 0; i < int(v.size()); i++) s << (i ? "," : "") << v[i];
  return s << '}';
}
template <typename S, typename T>
ostream& operator<<(ostream& s, pair<S, T> const& p) {
  return s << '(' << p.first << ',' << p.second << ')';
}
set<string> ans;
string s;
int N;
bool dp[10000][2];
void sv(int n, int l) {
  if (dp[n][l]) return;
  dp[n][l] = true;
  string t;
  if (l == 0 && n >= 6) {
    t = s.substr(n - 1, 2);
  } else if (l == 1 && n >= 7) {
    t = s.substr(n - 2, 3);
  } else {
    return;
  }
  ans.insert(t);
  if (s.substr(n + 1 - 2 * t.size(), t.size()) != t)
    sv(n - t.size(), t.size() - 2);
  sv(n - t.size(), !(t.size() - 2));
}
int main() {
  cin >> s;
  N = (int)s.size();
  sv(N - 1, 0);
  sv(N - 1, 1);
  printf("%d\n", (int)ans.size());
  for (auto const& x : ans) puts(x.c_str());
}
