51ms easy Java Trie solution 
\nclass Solution {\n    TrieNode root = new TrieNode();\n    public List<String> findAllConcatenatedWordsInADict(String[] words) {\n        List<String> res = n
```\nclass Solution {\n    TrieNode root = new TrieNode();\n    public List<String> findAllConcatenatedWordsInADict(String[] words) {\n        List<String> res = new ArrayList<>();\n        build(words);\n        for (String word : words)  \n            if (search(root,word,0,0))\n                res.add(word);\n        return res;\n    }\n    \n    public void build(String[] dict) {\n        for (String word : dict) {\n            if (word == null || word.length() == 0) continue;\n            TrieNode temp = root;\n            int len = word.length();\n            for (int i = 0; i < len; i++) {\n                char c = word.charAt(i);\n                if (temp.children[c-\'a\'] == null) temp.children[c-\'a\'] = new TrieNode();\n                temp = temp.children[c-\'a\'];\n            }\n            temp.isWord = true;\n        }\n    }\n    \n    public boolean search(TrieNode temp, String word, int index, int curr) {\n        int len = word.length();\n        for (int i = index; i < len; i++) {\n            if (temp.children[word.charAt(i)-\'a\'] == null) return false;\n            temp = temp.children[word.charAt(i)-\'a\'];\n            if (temp.isWord && search(root,word,i+1,curr+1)) return true;\n        }\n        return curr >= 1 && temp.isWord;\n    }\n}\n\nclass TrieNode {\n    boolean isWord;\n    TrieNode[] children;\n    public TrieNode(){\n        isWord = false;\n        children = new TrieNode[26];\n    }\n}\n```
[]