#include <bits/stdc++.h>
using namespace std;
vector<string> ans;
int mask, n;
bool check(string s, int L, int R) {
  if (s[L] == '0') {
    if (L + 1 == R) return 1;
    return 0;
  }
  int x = 0;
  for (int i = L; i < R; i++) x = x * 10 + (s[i] - '0');
  return (x >= 0 && x < 256);
}
void add(string s) {
  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 (s.size() - k >= 1 && s.size() - k <= 3) {
          if (check(s, 0, i) && check(s, i, j) && check(s, j, k) &&
              check(s, k, s.size())) {
            ans.push_back(s.substr(0, i) + '.' + s.substr(i, j - i) + '.' +
                          s.substr(j, k - j) + '.' + s.substr(k));
          }
        }
      }
}
void dfs(int L, string s, int pos, int used) {
  if (pos == L) {
    if (used == mask) add(s);
    return;
  }
  int pos2 = L - pos - 1;
  if (pos2 < pos) {
    if (mask != used) return;
    dfs(L, s + s[pos2], pos + 1, used);
  } else {
    for (int i = 0; i < 10; i++)
      if (mask & (1 << i))
        dfs(L, s + char('0' + i), pos + 1, (used | (1 << i)));
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    mask |= (1 << x);
  }
  if (n <= 6)
    for (int i = 4; i <= 12; i++) dfs(i, "", 0, 0);
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) cout << ans[i] << endl;
  return 0;
}
