Python Explanation
Let's discuss whether a word should be included in our answer.\nConsider the word as a topologically sorted directed graph, where each node is a letter, and an 
Let's discuss whether a word should be included in our answer.\nConsider the word as a topologically sorted directed graph, where each node is a letter, and an edge exists from i to j if word[i:j] is in our wordlist, [and there is no edge from i=0 to j=len(word)-1].  We want to know if there is a path from beginning to end.  If there is, then the word can be broken into concatenated parts from our wordlist.  To answer this question, we DFS over this graph.\n\nCode:\n```\nS = set(A)\nans = []\nfor word in A:\n  if not word: continue\n  stack = [0]\n  seen = {0}\n  M = len(word)\n  while stack:\n    node = stack.pop()\n    if node == M:\n      ans.append(word)\n      break\n    for j in xrange(M - node + 1):\n      if (word[node:node+j] in S and \n          node + j not in seen and\n          (node > 0 or node + j != M)):\n        stack.append(node + j)\n        seen.add(node + j)\n\nreturn ans\n```
[]