#include <bits/stdc++.h>
using namespace std;
int i, j, mini = 1000000000, p, d, n, m, k, ok, a, b, ul, c, op, maxi, ls, ld,
          mij;
int r[100005], good[100000][4];
set<string> myset;
string s;
string oo;
vector<int> v;
long long int t;
void go(int poz, int l) {
  if (good[poz][l] || poz - l < 4) return;
  myset.insert(s.substr(poz - l + 1, l));
  good[poz][l] = 1;
  if (l == 2) {
    go(poz - 2, 3);
    if (s[poz - 2] != s[poz] || s[poz - 3] != s[poz - 1]) go(poz - 2, 2);
  } else {
    go(poz - 3, 2);
    if (s[poz - 3] != s[poz] || s[poz - 4] != s[poz - 1] ||
        s[poz - 5] != s[poz - 2])
      go(poz - 3, 3);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> s;
  go(s.size() - 1, 2);
  go(s.size() - 1, 3);
  set<string>::iterator it;
  cout << myset.size() << "\n";
  for (it = myset.begin(); it != myset.end(); it++) {
    cout << *it << "\n";
  }
  return 0;
}
