#include <bits/stdc++.h>
using namespace std;
int m, n, j, k, l, i, o, p, __t, __LEN;
struct Ans {
  int num[4];
};
vector<Ans> final_ans;
int A[100], sum[10], digit[100], B[100];
void reDFS(int P, int which_IP, int num_IP) {
  if (P == __LEN + 1) {
    if (which_IP == 4 && num_IP != 0) {
      Ans ret;
      for (int i = (1); i <= (4); i++) ret.num[i - 1] = B[i];
      final_ans.push_back(ret);
    }
    return;
  }
  if (which_IP == 5) return;
  if (num_IP == 0 && digit[P] == 0) {
    B[which_IP] = 0;
    if (P == __LEN && which_IP == 4) {
      Ans ret;
      for (int i = (1); i <= (4); i++) ret.num[i - 1] = B[i];
      final_ans.push_back(ret);
      return;
    }
    reDFS(P + 1, which_IP + 1, 0);
    return;
  }
  if (num_IP * 10 + digit[P] <= 255) {
    B[which_IP] = num_IP * 10 + digit[P];
    reDFS(P + 1, which_IP, num_IP * 10 + digit[P]);
    B[which_IP] = num_IP;
  }
  if (num_IP != 0) {
    B[which_IP + 1] = 0;
    reDFS(P, which_IP + 1, 0);
  }
}
void check_ans() {
  int index_l = (__LEN + 1) / 2;
  int index_r = (__LEN) / 2 + 1;
  for (; index_l > 0; index_l--, index_r++) digit[index_r] = digit[index_l];
  reDFS(1, 1, 0);
}
void DFS(int P, int max_len, int digit_sum) {
  if (P == max_len + 1) {
    if (digit_sum == m) check_ans();
    return;
  }
  for (int next_digit = (1); next_digit <= (m); next_digit++) {
    digit[P] = A[next_digit];
    sum[next_digit]++;
    if (sum[next_digit] == 1) digit_sum++;
    DFS(P + 1, max_len, digit_sum);
    sum[next_digit]--;
    if (sum[next_digit] == 0) digit_sum--;
  }
}
int main() {
  scanf("%d", &m);
  if (m > 6) {
    printf("0\n");
    return 0;
  }
  for (int i = (1); i <= (m); i++) scanf("%d", A + i);
  for (int len = (4); len <= (12); len++) {
    __LEN = len;
    DFS(1, (len + 1) / 2, 0);
  }
  printf("%d\n", ((int)(final_ans.size())));
  for (int i = (0); i <= (((int)(final_ans.size())) - 1); i++)
    printf("%d.%d.%d.%d\n", final_ans[i].num[0], final_ans[i].num[1],
           final_ans[i].num[2], final_ans[i].num[3]);
}
