#include <bits/stdc++.h>
using namespace std;
int n, l, rp[512] = {}, as = 0;
vector<int> a, av;
bool gs[512] = {};
set<string> al;
bool good(int e) {
  if (e == 0 && (as & 1) == 0) return 0;
  while (e) {
    if ((as & (1 << (e % 10))) == 0) return 0;
    e /= 10;
  }
  return 1;
}
string its(int n) {
  if (n == 0) return "0";
  string ret = "";
  while (n) ret = (char)(n % 10 + '0') + ret, n /= 10;
  return ret;
}
bool isp(string s) {
  string t = s;
  reverse(t.begin(), t.end());
  return (t == s);
}
int sti(string s) {
  int ret = 0;
  for (int i = 0; i < s.size(); i++) ret *= 10, ret += (s[i] - '0');
  return ret;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> l, a.push_back(l), as |= (1 << l);
  if (n > 6) {
    cout << "0\n";
    return 0;
  }
  for (int i = 0; i < 256; i++)
    if (good(i)) {
      gs[i] = 1, av.push_back(i);
      int l = i;
      if (l == 0) rp[i] |= 1;
      while (l) rp[i] |= (1 << (l % 10)), l /= 10;
    }
  for (int i = 0; i < av.size(); i++)
    for (int j = 0; j < av.size(); j++)
      for (int k = 0; k < av.size(); k++) {
        if ((rp[av[i]] | rp[av[j]] | rp[av[k]]) != as) continue;
        string ds =
                   (string)its(av[i]) + (string)its(av[j]) + (string)its(av[k]),
               fs = (string)ds.substr(0, 1);
        if (!isp(ds + ds[0]) && (!isp(ds + ds[1] + ds[0]) || ds[1] == '0') &&
            (!isp(ds + ds[2] + ds[1] + ds[0]) ||
             sti(ds.substr(2, 1) + ds.substr(1, 1) + fs) > 255))
          continue;
        if (isp(ds + fs))
          al.insert(its(av[i]) + '.' + its(av[j]) + '.' + its(av[k]) + '.' +
                    fs);
        fs = ds[1] + fs;
        if (isp(ds + fs) && fs[0] != '0')
          al.insert(its(av[i]) + '.' + its(av[j]) + '.' + its(av[k]) + '.' +
                    fs);
        fs = ds[2] + fs;
        if (isp(ds + fs) && fs[0] != '0' && sti(fs) < 256)
          al.insert(its(av[i]) + '.' + its(av[j]) + '.' + its(av[k]) + '.' +
                    fs);
      }
  cout << al.size() << endl;
  while (!al.empty()) cout << *al.begin() << endl, al.erase(al.begin());
  return 0;
}
