#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1e5 + 10;
vector<string> tot[MaxN];
int cnt;
char s[MaxN];
bool check[MaxN], flag;
set<string> ans;
int main() {
  scanf("%s", s);
  int len = strlen(s);
  check[len] = 1;
  for (int i = len - 2; i >= 5; i--) {
    if (check[i + 2]) {
      string t;
      t += s[i];
      t += s[i + 1];
      if (tot[i + 2].size() == 0) {
        check[i] = 1;
        tot[i].push_back(t);
        ans.insert(t);
      } else {
        flag = 1;
        for (int j = 0; j < tot[i + 2].size(); j++) {
          if (tot[i + 2][j] != t) {
            flag = 0;
            break;
          }
        }
        if (!flag) {
          tot[i].push_back(t);
          ans.insert(t), check[i] = 1;
        }
      }
    }
    if (check[i + 3]) {
      string t;
      t += s[i];
      t += s[i + 1];
      t += s[i + 2];
      if (tot[i + 3].size() == 0) {
        check[i] = 1;
        tot[i].push_back(t);
        ans.insert(t);
      } else {
        flag = 1;
        for (int j = 0; j < tot[i + 3].size(); j++) {
          if (tot[i + 3][j] != t) {
            flag = 0;
            break;
          }
        }
        if (!flag) {
          tot[i].push_back(t);
          ans.insert(t), check[i] = 1;
        }
      }
    }
  }
  printf("%d\n", ans.size());
  for (set<string>::iterator ite = ans.begin(); ite != ans.end(); ite++) {
    cout << *ite << endl;
  }
  return 0;
}
