#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
const int maxn = 11000;
char dp[maxn][maxn];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  string s;
  cin >> s;
  int n = s.size();
  dp[n - 3][n] = dp[n - 2][n] = 1;
  set<string> ans;
  for (int i = (int)(n)-1; i >= 0; --i) {
    for (int j = i + 2; j <= i + 3; ++j) {
      for (int k = 2; k <= 3; ++k) {
        int jj = j + k;
        if (jj > n) break;
        if (dp[j][jj] && string(s.begin() + i, s.begin() + j) !=
                             string(s.begin() + j, s.begin() + jj)) {
          dp[i][j] = 1;
        }
      }
    }
  }
  for (int i = 0; i < (int)(n + 1); ++i)
    for (int j = i + 2; j <= i + 3; ++j) {
      if (i >= 5 && dp[i][j]) ans.insert(string(s.begin() + i, s.begin() + j));
    }
  cout << ans.size() << '\n';
  for (string s : ans) cout << s << '\n';
  return 0;
}
