#include <bits/stdc++.h>
using namespace std;
template <typename T>
T abs(T a) {
  return a < 0 ? -a : a;
}
template <typename T>
T sqr(T a) {
  return a * a;
}
const int INF = (int)1e9;
const long double EPS = 1e-9;
const long double PI = 3.1415926535897932384626433832795;
const int N = 20;
int n;
int d[N];
vector<string> ans;
int ln;
int md;
string s;
int szc;
char c[100500];
void brute2(int idx, int cnt) {
  if (cnt == 4 && idx == ln) {
    c[szc] = 0;
    ans.push_back(c);
    return;
  }
  if (cnt == 4 || idx == ln) return;
  int oszc = szc;
  if (cnt != 0) c[szc++] = '.';
  int cur = 0;
  char sc = s[idx];
  while (idx < ln) {
    c[szc++] = s[idx];
    cur = 10 * cur + (s[idx] - '0');
    if (cur < 256) {
      brute2(idx + 1, cnt + 1);
      idx++;
    } else
      break;
    if (sc == '0') break;
  }
  szc = oszc;
}
int cn;
int cnt[N];
void brute(int idx) {
  if (idx == md) {
    if (cn == 0) brute2(0, 0);
    return;
  }
  for (int i = 0; i < int(n); ++i) {
    cnt[i]++;
    if (cnt[i] == 1) cn--;
    s[idx] = '0' + d[i];
    s[ln - idx - 1] = s[idx];
    brute(idx + 1);
    cnt[i]--;
    if (cnt[i] == 0) cn++;
  }
  s[idx] = '.';
}
int main() {
  cin >> n;
  for (int i = 0; i < int(n); ++i) cin >> d[i];
  for (ln = 4; ln <= 12; ++ln) {
    s = "";
    for (int i = 0; i < int(ln); ++i) s.push_back('.');
    cn = n;
    memset(cnt, 0, sizeof(cnt));
    md = (ln >> 1) + (ln & 1);
    brute(0);
  }
  cout << int((ans).size()) << endl;
  for (int i = 0; i < int(int((ans).size())); ++i)
    printf("%s\n", ans[i].c_str());
  return 0;
}
