#include <bits/stdc++.h>
using namespace std;
const int N = 4000000;
int nans, aans[N], bans[N], cans[N], dans[N], A, B, C, D;
vector<int> v, vv, va, vb, vc;
int need, n, x[20], j;
bool is[20];
int AA, BB, CC;
bool good(int A) {
  if (A > 255) return false;
  v.clear();
  if (A == 0LL) {
    v.push_back(0);
    if (need % 2)
      return true;
    else
      return false;
  }
  while (A) {
    v.push_back(A % 10);
    if (((1 << (A % 10)) | need) != need) return false;
    A /= 10;
  }
  reverse(v.begin(), v.end());
  return true;
}
void work() {
  int j;
  for (j = 0; j < 10; j++) is[j] = false;
  for (j = 0; j < v.size(); j++) vv.push_back(v[j]);
  for (j = 0; j <= vv.size() / 2; j++) {
    is[vv[j]] = true;
    if (vv[j] != vv[vv.size() - 1 - j]) return;
  }
  for (j = 1; j <= n; j++)
    if (!is[x[j]]) return;
  nans++;
  aans[nans] = A;
  bans[nans] = B;
  cans[nans] = C;
  dans[nans] = D;
}
bool check() {
  int j;
  for (j = 0; j < 10; j++) is[j] = false;
  AA = A;
  if (AA == 0) is[0] = true;
  while (AA) {
    is[AA % 10] = true;
    AA /= 10;
  }
  BB = B;
  if (BB == 0) is[0] = true;
  while (BB) {
    is[BB % 10] = true;
    BB /= 10;
  }
  CC = C;
  if (CC == 0) is[0] = true;
  while (CC) {
    is[CC % 10] = true;
    CC /= 10;
  }
  for (j = 1; j <= n; j++)
    if (!is[x[n]]) return false;
  return true;
}
int main() {
  scanf("%d", &n);
  for (j = 1; j <= n; j++) {
    scanf("%d", &x[j]);
    need += (1 << x[j]);
  }
  for (A = 0; A < 256; A++)
    if (good(A)) {
      va.clear();
      for (j = 0; j < v.size(); j++) va.push_back(v[j]);
      for (B = 0; B < 256; B++)
        if (good(B)) {
          vb.clear();
          for (j = 0; j < v.size(); j++) vb.push_back(v[j]);
          for (C = 0; C < 256; C++)
            if (good(C)) {
              if (!check()) continue;
              vc.clear();
              for (j = 0; j < v.size(); j++) vc.push_back(v[j]);
              vv.clear();
              for (j = 0; j < va.size(); j++) vv.push_back(va[j]);
              for (j = 0; j < vb.size(); j++) vv.push_back(vb[j]);
              for (j = 0; j < vc.size(); j++) vv.push_back(vc[j]);
              D = vv[0];
              if (good(D)) work();
              vv.clear();
              for (j = 0; j < va.size(); j++) vv.push_back(va[j]);
              for (j = 0; j < vb.size(); j++) vv.push_back(vb[j]);
              for (j = 0; j < vc.size(); j++) vv.push_back(vc[j]);
              if (vv[1] != 0) {
                D = vv[1] * 10 + vv[0];
                if (good(D)) work();
              }
              vv.clear();
              for (j = 0; j < va.size(); j++) vv.push_back(va[j]);
              for (j = 0; j < vb.size(); j++) vv.push_back(vb[j]);
              for (j = 0; j < vc.size(); j++) vv.push_back(vc[j]);
              if (vv[2] != 0) {
                D = vv[2] * 100 + vv[1] * 10 + vv[0];
                if (good(D)) work();
              }
            }
        }
    }
  printf("%d\n", nans);
  for (j = 1; j <= nans; j++) {
    printf("%d.%d.%d.%d\n", aans[j], bans[j], cans[j], dans[j]);
  }
}
