#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void smn(T &a, const T &b) {
  if (b < a) a = b;
}
template <class T>
inline void smx(T &a, const T &b) {
  if (b > a) a = b;
}
template <class T>
inline T _rev(const T &a) {
  T _ = a;
  reverse(_.begin(), _.end());
  return _;
}
const double eps = 1e-8;
const long double leps = 1e-14;
int a[100];
bool mark[100];
vector<string> res;
int n;
int now[100];
void bt(int now, int *p) {
  int t = p[0] + p[1] + p[2] + p[3];
  int cnt = 0;
  for (int i = 0; i < n; i++)
    if (!mark[i]) cnt++;
  if (cnt > (t + 1) / 2 - now) return;
  int po = 0;
  for (int i = 0; i < 4; i++) {
    if (p[i] > 1 && ::now[po] == 0 && now > min(po, t - 1 - po)) return;
    int tn = 0;
    bool av = true;
    for (int t2 = 0; t2 < p[i]; t2++) {
      tn = 10 * tn + ::now[po + t2];
      if (min(po + t2, t - 1 - po - t2) >= now) {
        av = false;
        break;
      }
    }
    if (av && tn >= 256) return;
    po += p[i];
  }
  if (now > (t - 1) / 2) {
    int po = 0;
    string res;
    for (int i = 0; i < 4; i++) {
      for (int t = 0; t < p[i]; t++) res += char(::now[po + t] + '0');
      ;
      po += p[i];
      if (i != 3) res += '.';
    }
    ::res.push_back(res);
    return;
  }
  for (int i = 0; i < n; i++) {
    bool temp = mark[i];
    ::now[now] = ::now[t - 1 - now] = a[i];
    mark[i] = true;
    bt(now + 1, p);
    mark[i] = temp;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i1 = 1; i1 <= 3; i1++)
    for (int i2 = 1; i2 <= 3; i2++)
      for (int i3 = 1; i3 <= 3; i3++)
        for (int i4 = 1; i4 <= 3; i4++)
          if (i1 + i2 + i3 + i4 >= n) {
            int p[] = {i1, i2, i3, i4};
            bt(0, p);
          }
  cout << res.size() << '\n';
  for (int i = 0; i < res.size(); i++) cout << res[i] << '\n';
  return 0;
}
