#include <bits/stdc++.h>
int Set(int N, int pos) { return N = N | (1 << pos); }
int reSet(int N, int pos) { return N = N & ~(1 << pos); }
bool check(int N, int pos) { return (bool)(N & (1 << pos)); }
using namespace std;
string s;
int n;
bool dp[10010][4], taken[10010][4];
bool isSafe(int pos, int l1) {
  if (pos - l1 < 0) return true;
  for (int i = 0; i < l1; i++) {
    if (s[pos + i] != s[pos - l1 + i]) return true;
  }
  return false;
}
bool go(int pos, int pre) {
  if (pos > n) return false;
  if (pos == n) return dp[pos][pre] = true;
  if (taken[pos][pre]) return dp[pos][pre];
  taken[pos][pre] = true;
  bool ret = false;
  if (pre == 3) {
    ret |= go(pos + 2, 2);
    if (isSafe(pos, 3)) ret |= go(pos + 3, 3);
  }
  if (pre == 2) {
    ret |= go(pos + 3, 3);
    if (isSafe(pos, 2)) ret |= go(pos + 2, 2);
  }
  if (pre == 1) {
    ret |= go(pos + 1, 1);
    ret |= go(pos + 2, 2);
    ret |= go(pos + 3, 3);
  }
  return dp[pos][pre] = ret;
}
set<string> S;
void get_solution(int pos, int pre) {
  if (pos > n || taken[pos][pre]) return;
  taken[pos][pre] = true;
  string res;
  if (pre == 1) {
    if (dp[pos + 1][1]) get_solution(pos + 1, 1);
    if (dp[pos + 2][2]) {
      res = s.substr(pos, 2);
      S.insert(res);
      get_solution(pos + 2, 2);
    }
    if (dp[pos + 3][3]) {
      res = s.substr(pos, 3);
      S.insert(res);
      get_solution(pos + 3, 3);
    }
  }
  if (pre == 2) {
    if (dp[pos + 2][2]) {
      res = s.substr(pos, 2);
      S.insert(res);
      get_solution(pos + 2, 2);
    }
    if (dp[pos + 3][3]) {
      res = s.substr(pos, 3);
      S.insert(res);
      get_solution(pos + 3, 3);
    }
  }
  if (pre == 3) {
    if (dp[pos + 2][2]) {
      res = s.substr(pos, 2);
      S.insert(res);
      get_solution(pos + 2, 2);
    }
    if (dp[pos + 3][3]) {
      res = s.substr(pos, 3);
      S.insert(res);
      get_solution(pos + 3, 3);
    }
  }
}
int main() {
  int tc, t = 1;
  while (cin >> s) {
    n = s.size();
    memset(taken, false, sizeof taken);
    if (go(5, 1)) {
      memset(taken, false, sizeof taken);
      get_solution(5, 1);
    }
    for (int i = 0; i < n + 1; i++) {
      for (int j = 1; j < 4; j++) {
      }
    }
    set<string>::iterator it;
    cout << S.size() << endl;
    for (it = S.begin(); it != S.end(); it++) {
      cout << *it << endl;
    }
    S.clear();
  }
  return 0;
}
