#include <bits/stdc++.h>
using namespace std;
template <class T, class L>
bool smax(T &x, L y) {
  return x < y ? (x = y, 1) : 0;
}
template <class T, class L>
bool smin(T &x, L y) {
  return y < x ? (x = y, 1) : 0;
}
const int maxn = 1e4 + 17;
int n;
bool dp[maxn][4];
vector<string> ans;
string s;
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> s;
  n = s.size();
  reverse(s.begin(), s.end());
  dp[1][2] = dp[2][3] = 1;
  for (int i = 3; i < n; i++) {
    dp[i][2] = dp[i - 2][3] |
               (dp[i - 2][2] && s.substr(i - 3, 2) != s.substr(i - 1, 2));
    if (i - 5 >= 0)
      dp[i][3] = dp[i - 3][2] |
                 (dp[i - 3][3] && s.substr(i - 5, 3) != s.substr(i - 2, 3));
    else if (i - 4 >= 0)
      dp[i][3] = dp[i - 3][2];
  }
  for (int i = 0; i < n - 5; i++) {
    if (dp[i][2]) ans.push_back(s.substr(i - 1, 2));
    if (dp[i][3]) ans.push_back(s.substr(i - 2, 3));
  }
  for (auto &s : ans) s = string(s.rbegin(), s.rend());
  sort(ans.begin(), ans.end());
  ans.resize(unique(ans.begin(), ans.end()) - ans.begin());
  cout << ans.size() << '\n';
  for (auto s : ans) cout << s << '\n';
  return 0;
}
