#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void smin(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
inline void smax(T &a, T b) {
  if (a < b) a = b;
}
int k;
int d[11];
int mark[11], cmark;
vector<int> goods;
vector<pair<pair<int, int>, pair<int, int>>> ans;
void go(int x, int y, int w, int z) {
  char s[100];
  int len = sprintf(s, "%d%d%d%d", x, y, w, z);
  for (int i = 0, _n = (int)(len / 2); i < _n; i++)
    if (s[i] != s[len - 1 - i]) return;
  cmark += 7;
  for (int i = 0, _n = (int)(len); i < _n; i++) mark[s[i] - '0'] = cmark;
  for (int i = 0, _n = (int)(k); i < _n; i++)
    if (mark[d[i]] != cmark) return;
  ans.push_back(make_pair(pair<int, int>(x, y), pair<int, int>(w, z)));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> k;
  for (int i = 0, _n = (int)(k); i < _n; i++) cin >> d[i];
  sort(d, d + k);
  for (int i = 0, _n = (int)(256); i < _n; i++) {
    bool ok = 1;
    int x = i;
    do {
      ok &= binary_search(d, d + k, x % 10), x /= 10;
    } while (x);
    if (ok) goods.push_back(i);
  }
  for (int x : goods)
    for (int y : goods) {
      vector<int> v;
      if (y == 0) v.push_back(0);
      for (int yy = y; yy; yy /= 10) v.push_back(yy % 10);
      if (x == 0) v.push_back(0);
      for (int xx = x; xx; xx /= 10) v.push_back(xx % 10);
      reverse((v).begin(), (v).end());
      for (int i = (int)(1), _n = (int)((int((v).size()))); i < _n; i++)
        for (int j = (int)(i + 1), _n = (int)((int((v).size())) + 1); j < _n;
             j++) {
          int z = 0, w = 0;
          for (int p = (int)(j), _x = (int)(i); p-- > _x;) z = z * 10 + v[p];
          for (int p = (int)(i), _x = (int)(0); p-- > _x;) w = w * 10 + v[p];
          if (z >= 256 || w >= 256) continue;
          if ((z == 0 && j - i > 1) || (w == 0 && i > 1)) continue;
          go(x, y, z, w);
        }
    }
  for (int x : goods)
    for (int y : goods) {
      vector<int> v;
      if (y == 0) v.push_back(0);
      for (int yy = y; yy; yy /= 10) v.push_back(yy % 10);
      if (x == 0) v.push_back(0);
      for (int xx = x; xx; xx /= 10) v.push_back(xx % 10);
      reverse((v).begin(), (v).end());
      for (int i = (int)(1), _n = (int)((int((v).size()))); i < _n; i++)
        for (int j = (int)(i + 1), _n = (int)((int((v).size()))); j < _n; j++) {
          int z = 0, w = 0;
          for (int p = (int)(j), _x = (int)(i); p-- > _x;) z = z * 10 + v[p];
          for (int p = (int)((int((v).size()))), _x = (int)(j); p-- > _x;)
            w = w * 10 + v[p];
          if (z >= 256 || w >= 256) continue;
          if ((z == 0 && j - i > 1) || (w == 0 && (int((v).size())) - j > 1))
            continue;
          go(w, z, x, y);
        }
    }
  sort((ans).begin(), (ans).end());
  ans.erase(unique((ans).begin(), (ans).end()), ans.end());
  cout << (int((ans).size())) << endl;
  for (int i = 0, _n = (int)((int((ans).size()))); i < _n; i++)
    cout << ans[i].first.first << '.' << ans[i].first.second << '.'
         << ans[i].second.first << '.' << ans[i].second.second << endl;
  {
    int _;
    cin >> _;
    return 0;
  }
}
