#include <bits/stdc++.h>
using namespace std;
int N, num[11];
bool u[11];
struct IP {
  string a[4];
  void output() {
    for (int i = 0; i < 4; i++) cout << a[i] << (i < 3 ? '.' : '\n');
    return;
  }
};
bool legal(string str) {
  if (str.size() < 3) return true;
  if (str[0] > '2') return false;
  if (str[0] < '2') return true;
  if (str[1] > '5') return false;
  if (str[1] < '5') return true;
  if (str[2] > '5') return false;
  return true;
}
vector<IP> vec;
void get_dot(string &str, IP &ip, int i, int j, int len) {
  if (i == 4) {
    if (j == len) vec.push_back(ip);
    return;
  }
  ip.a[i] = "";
  for (int k = j; k < j + 3 && k < len; k++) {
    if (!legal((string)(ip.a[i] + str[k]))) break;
    ip.a[i] += str[k];
    get_dot(str, ip, i + 1, k + 1, len);
    if (k == j && str[k] == '0') break;
  }
  ip.a[i] = "";
  return;
}
string get_palin(string str, int len) {
  string res;
  for (int i = 0; i < len; i++) res += '0';
  for (int i = 0; i < str.size(); i++) res[i] = str[i];
  for (int i = (len + 1) >> 1; i < len; i++) res[i] = str[len - i - 1];
  return res;
}
bool every_digit(string str, int len) {
  for (int i = 0; i < N; i++) u[num[i]] = 0;
  for (int i = 0; i < len; i++) u[str[i] - '0'] = 1;
  for (int i = 0; i < N; i++)
    if (!u[num[i]]) return false;
  return true;
}
void dfs(string &str, int i, int len) {
  if (i == len) {
    if (every_digit(str, len)) {
      string str1 = get_palin(str, len * 2 - 1);
      IP t1, t2;
      get_dot(str1, t1, 0, 0, len * 2 - 1);
      if (len < 7) {
        str1 = get_palin(str, len * 2);
        get_dot(str1, t2, 0, 0, len * 2);
      }
    }
    return;
  }
  for (int k = 0; k < N; k++) {
    str[i] = num[k] + '0';
    dfs(str, i + 1, len);
  }
}
int main() {
  cin >> N;
  for (int i = 0; i < N; i++) cin >> num[i];
  string str = "0000000";
  for (int i = (2 < N ? N : 2); i < 8; i++) dfs(str, 0, i);
  cout << vec.size() << '\n';
  for (int i = 0; i < vec.size(); i++) vec[i].output();
}
