#include <bits/stdc++.h>
using namespace std;
vector<string> ans;
bool check(string s, int L, int R) {
  if (s[L] == '0') {
    if (R == L + 1) return true;
    return false;
  }
  int x = 0;
  int i;
  for (int i = L; i < R; i++) x = x * 10 + (s[i] - '0');
  return (x >= 0 && x < 256);
}
void Print() {
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) printf("%s\n", ans[i].c_str());
}
void Did(string s) {
  int N = s.length(), i, j, g;
  for (i = 1; i <= 3; i++)
    for (j = i + 1; j <= i + 3; j++)
      for (g = j + 1; g <= j + 3; g++)
        if (N - g >= 1 && N - g <= 3) {
          if (check(s, 0, i) && check(s, i, j) && check(s, j, g) &&
              check(s, g, N)) {
            string t = s.substr(0, i) + "." + s.substr(i, j - i) + "." +
                       s.substr(j, g - j) + "." + s.substr(g, N - g);
            ans.push_back(t);
          }
        }
}
void dfs(int L, string s, int sign1, int point1, int used) {
  int i;
  int point2 = L - 1 - point1;
  if (point1 == L) {
    if (used == sign1) Did(s);
    return;
  }
  if (point2 < point1) {
    char c = s[point2];
    if (sign1 != used) return;
    dfs(L, s + c, sign1, point1 + 1, used);
  } else {
    char cc;
    for (i = 0; i < 10; i++)
      if (sign1 & (1 << i)) {
        cc = '0' + i;
        dfs(L, s + cc, sign1, point1 + 1, (used | (1 << i)));
      }
  }
}
int main(void) {
  int N, x, sign1 = 0, i;
  cin >> N;
  for (i = 0; i < N; i++) {
    cin >> x;
    sign1 |= (1 << x);
  }
  if (N <= 6)
    for (i = 4; i <= 12; i++) dfs(i, "", sign1, 0, 0);
  Print();
  return 0;
}
