#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
const int maxn = 12;
int curs[maxn];
int need[10];
int len;
int d[maxn + 1][5];
vector<string> ans;
void gen(int iter, int pos, string cur) {
  if (len - pos > 3 * (4 - iter)) return;
  if (iter == 4) {
    ans.push_back(cur);
    return;
  }
  if (iter) cur += '.';
  int val = 0;
  for (int it = 0; it < 3 && pos + it < len; it++) {
    if (!val && it) break;
    val *= 10;
    val += curs[pos + it];
    cur += '0' + curs[pos + it];
    if (val >= 256) break;
    gen(iter + 1, pos + it + 1, cur);
  }
}
void countD() { gen(0, 0, ""); }
void solve(int iter) {
  if (iter > len - 1 - iter) {
    for (int i = 0; i < 10; i++)
      if (need[i] == 1) return;
    countD();
    return;
  }
  for (int digit = 0; digit < 10; digit++) {
    if (!need[digit]) continue;
    need[digit]++;
    curs[iter] = curs[len - 1 - iter] = digit;
    solve(iter + 1);
    need[digit]--;
  }
}
int main() {
  srand(rdtsc());
  int cntM;
  while (scanf("%d", &cntM) >= 1) {
    memset(need, 0, sizeof(need));
    for (int i = 0; i < cntM; i++) {
      int x;
      scanf("%d", &x);
      need[x]++;
    }
    ans.clear();
    for (len = 4; len <= 12; len++) {
      solve(0);
    }
    printf("%d\n", ((int)(ans).size()));
    sort(ans.begin(), ans.end());
    for (int i = 0; i < ((int)(ans).size()); i++)
      printf("%s\n", ans[i].c_str());
  }
  return 0;
}
