#include <bits/stdc++.h>
using namespace std;
vector<string> ans;
int n, used[10], id[4];
bool has[10];
char s[10];
string pr;
void add_point(int x, int y) {
  if (x == pr.length() && y == 4) {
    string s;
    stringstream ss;
    ss << id[0] << "." << id[1] << "." << id[2] << "." << id[3];
    ss >> s;
    ans.push_back(s);
  }
  if (x == pr.length() || y == 4) return;
  if (x + 1 * (4 - y) > pr.length() || x + 3 * (4 - y) < pr.length()) return;
  if (x + 1 <= pr.length()) {
    id[y] = (int)(pr[x] - '0');
    add_point(x + 1, y + 1);
  }
  if (x + 2 <= pr.length() && pr[x] != '0') {
    id[y] = (int)((pr[x] - '0') * 10 + pr[x + 1] - '0');
    add_point(x + 2, y + 1);
  }
  if (x + 3 <= pr.length() && pr[x] != '0') {
    id[y] = (pr[x] - '0') * 100 + (pr[x + 1] - '0') * 10 + pr[x + 2] - '0';
    if (id[y] < 256) add_point(x + 3, y + 1);
  }
}
string get_pr(string a, int type, int len) {
  string pr;
  a = a.substr(0, len);
  pr = a;
  reverse(a.begin(), a.end());
  if (type)
    pr += a;
  else
    pr += a.substr(1);
  return pr;
}
void work(int x) {
  bool ok = 1;
  for (int i = 0; i < 10; i++) {
    if (has[i] && !used[i]) {
      ok = 0;
      break;
    }
  }
  if (x >= 2 && ok) {
    pr = get_pr(s, 0, x);
    add_point(0, 0);
    pr = get_pr(s, 1, x);
    add_point(0, 0);
  }
  if (x == 6) return;
  for (int i = 0; i < 10; i++) {
    if (has[i]) {
      s[x] = i + '0';
      used[i]++;
      work(x + 1);
      used[i]--;
    }
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    has[x] = 1;
  }
  if (n > 6) {
    cout << 0 << endl;
    return 0;
  }
  work(0);
  sort(ans.begin(), ans.end());
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) cout << ans[i] << endl;
  return 0;
}
