#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Node {
  int next[26];
  bool f;
};
Node nd[23333];
char str[10010];
int ans, len;
bool dp[10010][2];
int tp;
bool same(int st, int ln) {
  if (st + ln >= len) return true;
  for (int i = 0; i < ln; ++i)
    if (str[st + ln - i] != str[st - i]) return true;
  return false;
}
int NewNode() {
  memset(nd[tp].next, 0, sizeof(nd[tp].next));
  nd[tp].f = 0;
  return tp++;
}
void Add(int root, int st, int en) {
  int k;
  while (st <= en) {
    k = str[st] - 'a';
    if (nd[root].next[k])
      root = nd[root].next[k];
    else
      root = (nd[root].next[k] = NewNode());
    st++;
  }
  if (!nd[root].f) {
    nd[root].f = 1;
    ans++;
  }
}
char s[5];
void prt(int root, int pos) {
  if (nd[root].f) {
    s[pos] = 0;
    puts(s);
  }
  for (int i = 0; i < 26; ++i) {
    if (nd[root].next[i]) {
      s[pos] = 'a' + i;
      prt(nd[root].next[i], pos + 1);
    }
  }
}
int main() {
  scanf("%s", str);
  tp = 0;
  len = strlen(str);
  memset(dp, 0, sizeof(dp));
  ans = 0;
  NewNode();
  dp[len - 1][0] = dp[len - 1][1] = 1;
  for (int i = len - 1; i >= 6; --i) {
    if (dp[i][0] && i >= 7) {
      Add(0, i - 2, i);
      dp[i - 3][1] = 1;
      if (same(i - 3, 3)) dp[i - 3][0] = 1;
    }
    if (dp[i][1] && i >= 6) {
      Add(0, i - 1, i);
      dp[i - 2][0] = 1;
      if (same(i - 2, 2)) dp[i - 2][1] = 1;
    }
  }
  printf("%d\n", ans);
  prt(0, 0);
  return 0;
}
