#include <bits/stdc++.h>
using namespace std;
int n, a, q;
int ans;
string res[10005];
inline int read() {
  int x = 0, k = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') k = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * k;
}
inline bool judge(string str, int x, int y) {
  if (str[x] == '0')
    if (y == x + 1)
      return true;
    else
      return false;
  int p = 0;
  for (int i = x; i < y; i++) p = (p << 3) + (p << 1) + (str[i] - '0');
  if (p >= 0 && p <= 255)
    return true;
  else
    return false;
}
inline void dfs(string str, int num, int maxn, int been) {
  if (num == maxn) {
    if (been == q) {
      int len = str.size();
      for (int i = 1; i <= 3; i++)
        for (int j = i + 1; j <= i + 3; j++)
          for (int k = j + 1; k <= j + 3; k++)
            if (len - k >= 1 && len - k <= 3 && judge(str, 0, i) &&
                judge(str, i, j) && judge(str, j, k) && judge(str, k, len))
              res[++ans] = str.substr(0, i) + "." + str.substr(i, j - i) + "." +
                           str.substr(j, k - j) + "." + str.substr(k, len - k);
    }
    return;
  }
  if (num * 2 > maxn - 1) {
    if (been != q) return;
    dfs(str + str[maxn - num - 1], num + 1, maxn, been);
    return;
  }
  for (int i = 0; i <= 9; i++)
    if (q & (1 << i)) dfs(str + char(i + 48), num + 1, maxn, been | (1 << i));
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) {
    a = read();
    q |= (1 << a);
  }
  if (n <= 6)
    for (int i = 4; i <= 12; i++) dfs("", 0, i, 0);
  printf("%d\n", ans);
  for (int i = 1; i <= ans; i++) printf("%s\n", res[i].c_str());
  return 0;
}
