#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:64000000")
int n;
bool need[10];
int dig[256][10];
int s[100];
bool tetra[10][10][10];
bool maybe[256];
bool masks[10];
vector<short>* ans;
void createDig() {
  for (int i = 0; i < 256; i++) {
    int num = i;
    if (!num) dig[i][++dig[i][0]] = 0;
    while (num) {
      dig[i][++dig[i][0]] = num % 10;
      num /= 10;
    }
    reverse(dig[i] + 1, dig[i] + dig[i][0] + 1);
  }
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      for (int k = 0; k < 10; k++) {
        int num = i * 100 + j * 10 + k;
        if (!i)
          tetra[i][j][k] = false;
        else if (num > 255) {
          tetra[i][j][k] = false;
        } else
          tetra[i][j][k] = true;
      }
    }
  }
  for (int i = 0; i < 256; i++) {
    maybe[i] = true;
    for (int j = 1; j <= dig[i][0]; j++) {
      if (!need[dig[i][j]]) maybe[i] = false;
    }
  }
}
bool isPolindrom() {
  int l = 1, r = s[0];
  while (r >= l) {
    if (s[l] == s[r]) {
      l++;
      r--;
      continue;
    } else
      return false;
  }
  return true;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int num;
    cin >> num;
    need[num] = true;
  }
  int cnt = 0;
  ans = new vector<short>[5000000];
  createDig();
  for (int i = 0; i < 256; i++) {
    if (!maybe[i]) continue;
    for (int j = 0; j < 256; j++) {
      if (!maybe[j]) continue;
      for (int k = 0; k < 256; k++) {
        if (!maybe[k]) continue;
        s[0] = 0;
        for (int t = 1; t <= dig[i][0]; t++) s[++s[0]] = dig[i][t];
        for (int t = 1; t <= dig[j][0]; t++) s[++s[0]] = dig[j][t];
        for (int t = 1; t <= dig[k][0]; t++) s[++s[0]] = dig[k][t];
        for (int t = 1; t <= s[0]; t++) masks[s[t]] = true;
        int ok = 0;
        for (int t = 0; t < 10; t++) {
          ok = ok + (need[t] ^ masks[t]);
          masks[t] = false;
        }
        if (ok) continue;
        s[++s[0]] = s[1];
        if (isPolindrom()) {
          ans[cnt].push_back(i);
          ans[cnt].push_back(j);
          ans[cnt].push_back(k);
          ans[cnt].push_back(s[1]);
          cnt++;
        }
        s[0] -= 1;
        s[++s[0]] = s[2];
        s[++s[0]] = s[1];
        if (s[2] != 0) {
          if (isPolindrom()) {
            ans[cnt].push_back(i);
            ans[cnt].push_back(j);
            ans[cnt].push_back(k);
            ans[cnt].push_back(s[2]);
            ans[cnt].push_back(s[1]);
            cnt++;
          }
        }
        s[0] -= 2;
        s[++s[0]] = s[3];
        s[++s[0]] = s[2];
        s[++s[0]] = s[1];
        if (tetra[s[3]][s[2]][s[1]]) {
          if (isPolindrom()) {
            ans[cnt].push_back(i);
            ans[cnt].push_back(j);
            ans[cnt].push_back(k);
            ans[cnt].push_back(s[3]);
            ans[cnt].push_back(s[2]);
            ans[cnt].push_back(s[1]);
            cnt++;
          }
        }
        s[0] -= s[3];
      }
    }
  }
  printf("%d\n", cnt);
  for (int i = 0; i < cnt; i++) {
    int dot = 0;
    for (int j = 0; j < ans[i].size(); j++) {
      if (j) {
        dot++;
        if (dot < 4) printf(".");
      }
      printf("%d", ans[i][j]);
    }
    printf("\n");
  }
  return 0;
}
