#include <bits/stdc++.h>
using namespace std;
int n, a[11], used[11], res;
vector<string> ans;
bool check(int st, int en, string str) {
  int tmp = 0;
  for (int i = st; i < en; i++) {
    tmp = tmp * 10 + (str[i] - '0');
  }
  if (str[st] == '0') {
    if (en - st == 1) return true;
    return false;
  }
  if ((tmp >= 0 && tmp <= 255)) return true;
  return false;
}
string cut(string str, int st, int en) { return str.substr(st, en - st); }
void print(string str) {
  int len = str.size();
  for (int i = 1; i <= 3; i++)
    for (int j = i + 1; j <= i + 3; j++)
      for (int k = j + 1; k <= j + 3; k++) {
        int o = len - k;
        if (o < 1 || o > 3) continue;
        if (check(0, i, str) && check(i, j, str) && check(j, k, str) &&
            check(k, len, str)) {
          string s = cut(str, 0, i) + "." + cut(str, i, j) + "." +
                     cut(str, j, k) + "." + cut(str, k, len);
          ans.push_back(s);
          res++;
        }
      }
}
void dfs(int len, string str, int point1, int point2) {
  if (point1 == len) {
    for (int i = 1; i <= n; i++) {
      if (!used[a[i]]) return;
    }
    print(str);
    return;
  } else {
    if (point1 > point2) {
      dfs(len, str + str[point2], point1 + 1, point2 - 1);
    } else {
      for (int i = 1; i <= n; i++) {
        char c = a[i] + '0';
        string tmp_str = str + c;
        used[a[i]]++;
        dfs(len, tmp_str, point1 + 1, point2 - 1);
        used[a[i]]--;
      }
    }
  }
}
int main() {
  cin >> n;
  if (n > 6) {
    cout << 0;
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (int i = 4; i <= 12; i++) {
    memset(used, 0, sizeof(used));
    dfs(i, "", 0, i - 1);
  }
  cout << res << endl;
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i] << endl;
  }
  return 0;
}
