Read a crossword with a twist! Similar to this question, but this is a crossword variation!

Instead of only one letter per grid square, you can have one or two.

Input:


A 2d array, or whatever works in your language.
You can assume valid inputs
Any array size must work


Output:


An array of all the words


Across and down
All words must be joined together, i.e. linked in an unbroken chain of words (if not return false)
Words must be at least two grid squares, not letters



Example:

[["",  "wo", "r",  "k"],
[ "",   "r",  "",   ""],
[ "he", "l",  "lo", ""],
[ "",   "d",  "ad", ""]]


Returns:

["work", "world", "hello", "load", "dad"]


Example:

[["he", "ll", "o"],
[ "",   "",   ""],
[ "wo", "r",  "ld"]]


Returns:

false


This is fastest-code, so I'll be running this on windows 7 with 2.5ghz and 16gb of ram. If your code is really esoteric, provide a link to the compiler so I can actually run it.
Python 3

import numpy
from scipy.ndimage import measurements

def crosswords(arr):
    M=numpy.asarray(arr)
    # check connectivity
    if measurements.label(numpy.where(M!='',1,0))[-1] != 1:
        return 'false'

    words = []
    def get_words(mat):
        for r in mat:
            word,counter='',0
            for c in r:
                if c=='':
                    if counter&gt;1:
                        words.append(word)
                    word, counter = '', 0
                else:
                    word, counter = word+c, counter+1
            if counter &gt; 1:
                words.append(word)
    get_words(M)
    # transpose M
    get_words(M.T)
    return words


Usage:

Function takes an array of array of strings as input:

crosswords(
[["",  "wo", "r",  "k"],
[ "",   "r",  "",   ""],
[ "he", "l",  "lo", ""],
[ "",   "d",  "ad", ""]])

Returns the string false when connectivity returns multiple labels.
Returns array of valid words otherwise.

I timed it with timeit, time.time() and using the console command time and but I don't know which one to use or which one to post here.