#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int Maxn = 1005;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
struct pos {
  int first, second, third;
};
int n, a[10], af, avl[16], ip[16], dig[16];
vector<unsigned> sol;
void dfs(int u, int v) {
  if (u > v) {
    int cur = 0, flg = 0;
    unsigned p = 0;
    for (int(i) = 0; (i) < (int)(4); i++) {
      int t = 0;
      for (int(j) = 0; (j) < (int)(dig[i]); j++) {
        t = t * 10 + ip[cur + j];
        flg |= 1 << ip[cur + j];
      }
      cur += dig[i];
      if (t < 0 || t >= 256) return;
      p = (p << 8) + t;
    }
    if (af == flg) sol.push_back(p);
    return;
  }
  for (int(k) = 0; (k) < (int)(10); k++) {
    if ((avl[u] & (1 << k)) && (avl[v] & (1 << k))) {
      ip[u] = ip[v] = k;
      dfs(u + 1, v - 1);
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int(i) = 0; (i) < (int)(n); i++) {
    int x;
    scanf("%d", &x);
    a[x] = 1;
    af |= 1 << x;
  }
  for (int(ds) = 0; (ds) < (int)(81); ds++) {
    int am = 0;
    memset(avl, 0, sizeof(avl));
    for (int i = 0, s = ds; i < 4; i++, s /= 3) {
      int d = s % 3 + 1;
      dig[i] = d;
      for (int(j) = 0; (j) < (int)(d); j++) {
        for (int(k) = 0; (k) < (int)(10); k++) {
          if (!a[k]) continue;
          if (j == 0 && k == 0 && d != 1) continue;
          if (j == 0 && d == 0 && k > 2) continue;
          avl[am] |= 1 << k;
        }
        am++;
      }
    }
    dfs(0, am - 1);
  }
  printf("%d\n", sol.size());
  for (int(i) = 0; (i) < (int)(sol.size()); i++) {
    printf("%u.%u.%u.%u\n", sol[i] >> 24, (sol[i] >> 16) & 255,
           (sol[i] >> 8) & 255, sol[i] & 255);
  }
  return 0;
}
