#include <bits/stdc++.h>
using namespace std;
int i, j, k, n;
bool u[20];
bool w[20];
char s[20];
struct T {
  int a[4];
  int &operator[](int i) { return a[i]; }
} t;
vector<T> v;
void upd(char *beg, char *end) {
  int n = end - beg;
  int i, j, k, m;
  char *ch;
  for (i = 0; i < 10; i++) w[i] = 0;
  for (ch = beg; ch != end; ch++) w[*ch - '0'] = 1;
  for (i = 0; i < 10; i++)
    if (w[i] != u[i]) return;
  for (i = max(1, n - 9); i <= 1 + (*beg != '0') * 2 && i <= n - 3; i++) {
    for (t[0] = 0, m = 0; m < i; m++) t[0] = t[0] * 10 + *(beg + m) - '0';
    if (t[0] > 255) continue;
    for (j = max(1, n - i - 6);
         j <= 1 + (*(beg + i) != '0') * 2 && i + j <= n - 2; j++) {
      for (t[1] = 0, m = i; m < i + j; m++) t[1] = t[1] * 10 + *(beg + m) - '0';
      if (t[1] > 255) continue;
      for (k = max(1, n - i - j - 3);
           k <= 1 + (*(beg + i + j) != '0') * 2 && i + j + k <= n - 1; k++) {
        for (t[2] = 0, m = i + j; m < i + j + k; m++)
          t[2] = t[2] * 10 + *(beg + m) - '0';
        if (t[2] > 255) continue;
        if (*(beg + i + j + k) == '0' && n - i - j - k != 1) continue;
        for (t[3] = 0, m = i + j + k; m < n; m++)
          t[3] = t[3] * 10 + *(beg + m) - '0';
        if (t[3] > 255) continue;
        v.push_back(t);
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  while (n--) {
    scanf("%d", &i);
    u[i] = 1;
    j++;
  }
  if (u[0] && j == 1) v.push_back(t);
  for (i = 1; i < 1000000; i++) {
    if (i == 12789) i = i;
    sprintf(s, "00%d", i);
    for (j = i, k = strlen(s); j; j /= 10, k++) s[k] = j % 10 + '0';
    s[k] = s[k + 1] = '0';
    s[k + 2] = 0;
    for (j = 0; j < 3; j++) upd(s + j, s + k + 2 - j);
    sprintf(s, "00%d", i);
    for (j = i / 10, k = strlen(s); j; j /= 10, k++) s[k] = j % 10 + '0';
    s[k] = s[k + 1] = '0';
    s[k + 2] = 0;
    for (j = 0; j < 3; j++) upd(s + j, s + k + 2 - j);
  }
  printf("%d\n", v.size());
  for (i = 0; i < v.size(); i++)
    for (j = 0; j < 4; j++) printf("%d%c", v[i][j], j == 3 ? '\n' : '.');
  return 0;
}
