#include <bits/stdc++.h>
using namespace std;
int n, d[16];
vector<string> vs;
vector<string> vps;
vector<unsigned int> vip;
vector<unsigned int> vip2;
string base;
int nstr;
void dfs1(int len, string cur) {
  getchar();
  if (len <= 0) {
    vs.push_back(base + cur);
    return;
  }
  for (int i = 0; i < n; ++i) {
    dfs1(len - 1, cur + char('a' + i));
  }
}
string str;
int lenStr;
void putIp(unsigned int ip) {
  printf("%d.%d.%d.%d\n", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF,
         (ip >> 8) & 0xFF, (ip >> 0) & 0xFF);
}
void dfs2(int idx, unsigned int ip, int pre, int cur) {
  int lenWord = cur - pre;
  if (cur == lenStr) {
    if (idx != 3) return;
    if (lenWord > 0 && lenWord < 4) {
      int tmp = 0;
      for (int i = pre; i < cur; ++i) {
        tmp = tmp * 10 + d[(str[i] - 'a')];
      }
      if (tmp < 256 && (lenWord == 1 || d[str[pre] - 'a'] > 0)) {
        ip |= (tmp << (8 * (3 - idx)));
        vip.push_back(ip);
        return;
      }
    }
    return;
  }
  if (idx > 3) return;
  if (lenWord > 0 && lenWord < 4) {
    int tmp = 0;
    for (int i = pre; i < cur; ++i) {
      tmp = tmp * 10 + d[(str[i] - 'a')];
    }
    if (tmp < 256 && (lenWord == 1 || d[str[pre] - 'a'] > 0)) {
      dfs2(idx + 1, ip | (tmp << ((3 - idx) * 8)), cur, cur + 1);
    }
  }
  dfs2(idx, ip, pre, cur + 1);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> d[i];
    base += (i + 'a');
  }
  if (n > 6) {
    printf("0\n");
  } else {
    for (int i = max(2, n); i <= 6; ++i) {
      dfs1(i - n, string(""));
    }
    for (int i = 0; i < vs.size(); ++i) {
      int p[8] = {0};
      for (int j = 0; j < vs[i].size(); ++j) {
        p[j] = j;
      }
      do {
        string tmp;
        for (int j = 0; j < vs[i].size(); ++j) {
          tmp += vs[i][p[j]];
        }
        for (int j = vs[i].size() - 1; j >= 0; --j) {
          tmp += vs[i][p[j]];
        }
        vps.push_back(tmp);
        tmp = "";
        for (int j = 0; j < vs[i].size(); ++j) {
          tmp += vs[i][p[j]];
        }
        for (int j = vs[i].size() - 2; j >= 0; --j) {
          tmp += vs[i][p[j]];
        }
        if (tmp.size() >= 4) vps.push_back(tmp);
      } while (next_permutation(p, p + vs[i].size()));
    }
    for (int i = 0; i < vps.size(); ++i) {
      str = vps[i];
      lenStr = str.size();
      dfs2(0, 0, 0, 0);
    }
    sort(vip.begin(), vip.end());
    for (int i = 0; i < vip.size(); ++i) {
      if (i == 0 || vip[i] != vip[i - 1]) vip2.push_back(vip[i]);
    }
    printf("%d\n", vip2.size());
    for (int i = 0; i < vip2.size(); ++i) {
      putIp(vip2[i]);
    }
  }
  return 0;
}
