#include <bits/stdc++.h>
using namespace std;
int n, s[20], p[20], a[4], b[20], cnt, c[10];
char ret[1000005][18];
void Parse(int pos, int x, int len) {
  if (x == 4 && pos == len) {
    sprintf(ret[cnt++], "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
  }
  if (x == 4) return;
  if (len - pos < (4 - x)) return;
  if (len - pos > (4 - x) * 3) return;
  a[x] = p[pos];
  Parse(pos + 1, x + 1, len);
  if (pos + 2 <= len) {
    a[x] = p[pos] * 10 + p[pos + 1];
    if (p[pos] != 0) Parse(pos + 2, x + 1, len);
  }
  if (pos + 3 <= len) {
    a[x] = p[pos] * 100 + p[pos + 1] * 10 + p[pos + 2];
    if (a[x] < 256 && p[pos] != 0) Parse(pos + 3, x + 1, len);
  }
}
int Check(int len) {
  for (int i = (0); i < (10); i++) c[i] = 1;
  for (int i = (0); i < (n); i++) c[b[i]] = 0;
  for (int i = (0); i < (len); i++) c[p[i]]++;
  for (int i = (0); i < (10); i++)
    if (c[i] == 0) return 0;
  return 1;
}
void Gen(int x, int depth) {
  if (x == depth) {
    for (int i = (0); i < (depth); i++) p[i] = s[i];
    for (int i = (0); i < (depth); i++) p[i + depth] = s[depth - i - 1];
    if (Check(2 * depth)) Parse(0, 0, 2 * depth);
    for (int i = (0); i < (depth - 1); i++) p[i + depth] = s[depth - i - 2];
    if (Check(2 * depth - 1)) Parse(0, 0, 2 * depth - 1);
  } else {
    for (int i = (0); i < (n); i++) {
      s[x] = b[i];
      Gen(x + 1, depth);
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = (0); i < (n); i++) scanf("%d", &b[i]);
  cnt = 0;
  for (int i = (2); i <= (6); i++) Gen(0, i);
  printf("%d\n", cnt);
  for (int i = (0); i < (cnt); i++) printf("%s\n", ret[i]);
  return 0;
}
