#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXWORDS 150000
#define MAXWORDLEN 64
#define MAXTEXTLEN 1000

/* char *code = "4374283338365926394842"; */
char *code = "437428333836592639484227346745362373746875978374362635269737833668435244334726483532633447725624246784472769263429332884337294643343634477446925225262875338372468428927668938843724663568337388334474327874536859462373267434232663864462383743733284437927833263994844648756673276964728325684374484646332663676392926376739663437273284842842323688766446688373776224385232468636763938833274372276778438473232273283333434372984373242453327247328793386684372984393553338642323743344684374646322926375954634353238554733662776354784322695639448324462423786632374334373328423346534648434733675844474245394424743423867687376643776884645483729348763568347626464866484642476673647263943724346254638642346878448396827447826323396673724746927384373266342632733578439348935536684478374362679373343365333447729676328592639484787654647257763346437733588437666847546";

FILE *soubor;
char s[MAXWORDS][MAXWORDLEN];
char orig[MAXWORDS][MAXWORDLEN];
int word_len[MAXWORDS];
int best_word[MAXTEXTLEN];
int words[MAXTEXTLEN];

static inline void encode(char *in, char *out)
{
	int i;
	char tab[] = "22233344455566677778889999";

	for (i = 0; in[i] != '\n'; i++)
		out[i] = tab[in[i]-'a'];
	out[i] = 0;
}

void reconstruct(int pos)
{
	int sentence[MAXWORDS];
	int num = words[pos], i;

	while (pos) {
		sentence[words[pos]-1] = best_word[pos];
		pos -= word_len[best_word[pos]];
	}

	for (i = 0; i < num-1; i++)
		printf("%s ", orig[sentence[i]]);
	printf("%s\n", orig[sentence[i]]);
}

int earlier(int new, int old)
{
	int pnew = 0, pold = 0;

	while (new != old) {
		pnew = new;
		pold = old;
		new -= word_len[best_word[new]];
		old -= word_len[best_word[old]];
	}
	return best_word[pold] > best_word[pnew];
}

int main(void)
{
        int i, j, textlen = strlen(code);

        soubor = fopen("slova", "r");
        if (!soubor)
                return 1;
        for (i = 0; fgets(orig[i], MAXWORDLEN, soubor); i++) {
		encode(orig[i], s[i]);
		word_len[i] = strlen(s[i]);
		orig[i][strlen(orig[i])-1] = 0;
	}
	for (i = 1; i <= textlen; i++)
		words[i] = MAXTEXTLEN+1;
	words[0] = 0;
	for (i = 0; i < textlen; i++) {
		for (j = 0; s[j][0]; j++) {
			if (i+word_len[j] <= textlen && !memcmp(s[j], code+i, word_len[j])) {
				if (words[i]+1 < words[i+word_len[j]] ||
				    (words[i]+1 == words[i+word_len[j]] && earlier(i, i+word_len[j]-word_len[best_word[i+word_len[j]]]))) {
					words[i+word_len[j]] = words[i]+1;
					best_word[i+word_len[j]] = j;
				}
			}
		}
	}

	reconstruct(i);

        return 0;
}

