#include <bits/stdc++.h>
using namespace std;
int n, ok[10], oku[10], ucs;
char a[15];
char r[30];
vector<string> sol;
void match(int c, int p, int len, int nr = 0) {
  if (c == 4 && p == len) {
    r[nr] = 0;
    sol.push_back(r + 1);
    return;
  }
  if (c == 4) return;
  if (p >= len) return;
  r[nr++] = '.';
  for (int t = 1; t <= 3 && p + t <= len; t++) {
    int v = 0;
    for (int u = 0; u < t; u++) v = v * 10 + a[p + u] - '0';
    if ((v > 0 && a[p] == '0') || v > 255 || (v == 0 && t > 1)) continue;
    for (int u = 0; u < t; u++) r[nr + u] = a[p + u];
    match(c + 1, p + t, len, nr + t);
  }
}
bool appear(int len) {
  ucs++;
  int cnt = 0;
  for (int i = 0; i < len; i++) {
    cnt += (oku[a[i] - '0'] != ucs);
    oku[a[i] - '0'] = ucs;
    if (!ok[a[i] - '0']) return false;
  }
  return cnt == n;
}
void go(int x, int len) {
  if (x == len) {
    if (len > 2) {
      for (int i = x - 2, y = x; i >= 0; i--, y++) a[y] = a[i];
      a[len * 2 - 1] = 0;
      if (appear(len)) match(0, 0, len * 2 - 1);
    }
    if (len < 6 || a[0] <= '2') {
      for (int i = x - 1, y = x; i >= 0; i--, y++) a[y] = a[i];
      if (appear(len)) match(0, 0, len * 2);
    }
    return;
  }
  for (int i = 0; i < 10; i++) {
    a[x] = i + '0';
    go(x + 1, len);
  }
}
int main(void) {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    ok[x] = 1;
  }
  for (int len = 2; len <= 6; len++) go(0, len);
  printf("%d\n", ((int)(sol).size()));
  for (__typeof((sol).begin()) it = (sol).begin(); it != (sol).end(); it++)
    puts(it->c_str());
  return 0;
}
