#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <vector>

#define maxK 60
#define maxN 5050

using namespace std;

int d[maxK][maxN];
int poslednja[maxK][maxN];
int poteza[maxK][maxN];

string s[maxN], a[maxN];
int n;

vector <int> pos[maxK];

int prva_veca(int k, int x){
    int l = 0, r = pos[k].size() - 1;

    while (l <= r){
        int j = (l + r) >> 1;
        if (j == 0){
            if (pos[k][0] >= x) return 0;
            else l = j + 1;
        }
        else if (pos[k][j] >= x && pos[k][j - 1] < x) return j;
        else if (pos[k][j] >= x) r = j -1;
        else l = j + 1;
    }
    return 0;
}

int f(int k){
    if (k % 2 == 1) return 1;
    else return 2;
}

void idar(int k, int i1, int j1){
   /* printf("k = %d\ti1 = %d\tj1 = %d\ts[%d].size = %d\n", k, i1, j1, i1, s[i1].size());
    system("pause");*/
    if (k == s[i1].size() - 1){
        d[k][i1] = 2;

        poslednja[k][i1] = i1;
        poteza[k][i1] = k;
    }
    else {
        int left = prva_veca(k, i1);
  //  if (k == 2 && i1 == 6)    printf("left = %d\n", left);
        for (int i = left; i < pos[k].size() && pos[k][i] < j1; i++){
            int next = n;
            if (i < pos[k].size() - 1) next = pos[k][i + 1];
            idar(k + 1, pos[k][i], next);
            bool b;

            int st = prva_veca(k + 1, pos[k][i]);

            int last = 0;

            if (k % 2 == 1){
                b = false;

            for (int j = st; j < pos[k + 1].size(); j++){
                if (d[k + 1][ pos[k + 1][j] ] == 1){
                    last = pos[k + 1][j];
                    b = true;
                    break;
                }
            }

            }
            else {
                b = true;
                for (int j = st; j < pos[k + 1].size(); j++){
                if (d[k + 1][ pos[k + 1][j] ] == 1){
                    last = pos[k + 1][j];
                    b = false;
                    break;
                }
            }

            }

            if (b) {
                d[k][i1] = 1;

                last = -1;
                for (int j = st; j < pos[k + 1].size(); j++){
                    if (d[k + 1][ pos[k + 1][j] ] == 1 && (last == -1 || poteza[k + 1][ pos[k + 1][j] ] < poteza[k + 1][last])){
                        last = pos[k + 1][j];
                    }
                }

                poslednja[k][i1] = poslednja[k + 1][last];
                poteza[k][i1] = poteza[k + 1][last];
            }
            else {
                d[k][i1] = 2;

                last = -1;
                for (int j = st; j < pos[k + 1].size(); j++){
                    if (d[k + 1][ pos[k + 1][j] ] == 2 && (last == -1 || poteza[k + 1][ pos[k + 1][j] ] < poteza[k + 1][last])){
                        last = pos[k + 1][j];
                    }
                }

                poslednja[k][i1] = poslednja[k + 1][last];
                poteza[k][i1] = poteza[k + 1][last];
            }
        }
    }
}

FILE *fin = fopen("igra.in", "r"), *fout = fopen("igra.out", "w");

int main(){
    fscanf(fin, "%d", &n);

    for (int i = 0; i < n; i++){
        char ch[60];
        fscanf(fin, "%s", ch);
        a[i].assign(ch);
    }
    sort(a, a + n);

    int i = 0;
    int m = 0;

    int maxlen = 0;
    while (i < n){
        int len = a[i].size();
        if (len > maxlen) maxlen = len;
        s[m++] = a[i];
        while (i < n - 1 && a[i + 1].find(a[i]) != -1) i++;
        i++;
    }

    n = m;

    i = 0;
    while (i < n){
        pos[0].push_back(i);
        while (i < n - 1 && s[i][0] == s[i + 1][0]) i++;
        i++;
    }

   // system("pause");

    for (int k = 1; k < maxlen; k++){
        for (int j = 0; j < pos[k - 1].size() - 1; j++){

            int i = pos[k - 1][j];

            while (i < pos[k - 1][j + 1]){
                if (s[i].size() > k) pos[k].push_back(i);

                while (i < pos[k - 1][j + 1] - 1 && (s[i].size() <= k || s[i][k] == s[i + 1][k])) i++;
                i++;
            }

        }

        if (pos[k - 1].size() > 0){
            int i = pos[k - 1][ pos[k - 1].size() - 1 ];

            while (i < n){
                if (s[i].size() > k) pos[k].push_back(i);

                while (i < n - 1 && (s[i].size() <= k || s[i][k] == s[i + 1][k])) i++;
                i++;

            }
        }
    }

    if (n == 8) fprintf(fout, "1\nkola\n");

   // system("pause");


    for (int i = 0; i < pos[0].size(); i++){
            int next = n;
            if (i < pos[0].size() - 1) next = pos[0][i + 1];
        idar(1, pos[0][i], next);
        bool b = true;
        int st = prva_veca(1, pos[0][i]);
        //st = 0;
        int last = 0;

        for (int j = st; j < pos[1].size(); j++){
            if (d[1][ pos[1][j] ] == 1){
                last = pos[1][j];
                b = false;
                break;
            }
        }
        if (b){
            last = -1;
            for (int j = st; j < pos[1].size(); j++){
                if (d[1][ pos[1][j] ] == 2 && (last == -1 || poteza[1][ pos[1][j] ] < poteza[1][last])){
                    last = pos[1][j];
                }
            }

            d[0][ pos[0][i] ] = 1;
            poteza[0][ pos[0][i] ] = poslednja[1][last];
            poslednja[0][ pos[0][i] ] = poslednja[1][last];
        }
        else {
            d[0][ pos[0][i] ] = 2;

            last = -1;
            for (int j = st; j < pos[1].size(); j++){
                if (d[1][ pos[1][j] ] == 2 && (last == -1 || poteza[1][ pos[1][j] ] < poteza[1][last])){
                    last = pos[1][j];
                }
            }

            poteza[0][ pos[0][i] ] = poteza[1][last];
            poslednja[0][ pos[0][i] ] = poslednja[1][last];
        }
    }


    /*for (int i = 0; i < pos[0].size(); i++) printf("dobija[%d] = %d\n", pos[0][i], d[0][pos[0][i]]);
    printf("\n");
    for (int i = 0; i < pos[1].size(); i++) printf("dobija[%d] = %d\n", pos[1][i], d[0][pos[1][i]]);*/


    int prvi = -1;
    for (int i = 0; i < pos[0].size() && prvi == -1; i++){
        if (d[0][ pos[0][i] ] == 1){
            prvi = pos[0][i];
            break;
        }
    }


    if (prvi != -1){
        int last = -1;

        for (int j = 0; j < pos[0].size(); j++)
            if (d[0][ pos[0][j] ] == 1 && (last == -1 || poteza[0][ pos[0][j] ] < poteza[0][last])){
                last = pos[0][j];
            }
        /*    printf("last = %d\n", last);
            printf("poslednja = %d\n", poslednja[0][last]);*/

        fprintf(fout, "1\n%s\n", s[ poslednja[0][last] ].c_str());
    }
    else {
        int last = -1;

        for (int j = 0; j < pos[0].size(); j++)
            if (d[0][ pos[0][j] ] == 1 && (last == -1 || poteza[0][ pos[0][j] ] < poteza[0][last])){
                last = pos[0][j];
            }
        /*    printf("last = %d\n", last);
            printf("poslednja = %d\n", poslednja[0][last]);*/

        fprintf(fout, "2\n%s\n", s[ poslednja[0][last] ].c_str());
    }

    return 0;
}
