#include <bits/stdc++.h>
using namespace std;
int c[12];
int p;
int N;
vector<vector<int>> ans;
void rasst() {
  set<int> check;
  for (int i = 0; i < p; ++i) {
    check.insert(c[i]);
  }
  if (check.size() < N) return;
  int c1 = 0, c2 = 0, c3 = 0, c4;
  for (int i1 = 0; i1 < p - 3; ++i1) {
    if (c1 == 0 && i1 != 0) return;
    c1 *= 10;
    c1 += c[i1];
    if (c1 > 255) continue;
    c2 = 0;
    for (int i2 = i1 + 1; i2 < p - 2; ++i2) {
      if (c2 == 0 && i2 != i1 + 1) break;
      c2 *= 10;
      c2 += c[i2];
      if (c2 > 255) continue;
      c3 = 0;
      for (int i3 = i2 + 1; i3 < p - 1; ++i3) {
        if (c3 == 0 && i3 != i2 + 1) break;
        c3 *= 10;
        c3 += c[i3];
        if (c3 > 255) continue;
        c4 = 0;
        int f = 0;
        for (int j1 = i3 + 1; j1 < p; ++j1) {
          if (c4 == 0 && j1 != i3 + 1) f = 1;
          c4 *= 10;
          c4 += c[j1];
        }
        if (f == 1 || c4 > 255) continue;
        vector<int> a(4);
        a[0] = c1;
        a[1] = c2;
        a[2] = c3;
        a[3] = c4;
        ans.push_back(a);
      }
    }
  }
}
void recurs2(vector<int>& arr, int n, int m) {
  if (m == 0) {
    for (int j = p / 2; j < p; ++j) {
      c[j] = c[p - j - 1];
    }
    rasst();
    return;
  } else {
    for (int j = 0; j < n; ++j) {
      c[m - 1] = arr[j];
      recurs2(arr, n, m - 1);
    }
  }
}
inline void recurs(vector<int>& arr, int n, int i) {
  int m = i / 2 + i % 2;
  p = i;
  recurs2(arr, n, m);
}
int main() {
  if (0) {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
  }
  int n;
  cin >> n;
  if (n > 6) {
    cout << "0";
    return 0;
  }
  N = n;
  vector<int> arr(n);
  for (int i = 0; i < n; ++i) {
    cin >> arr[i];
  }
  for (int i = max(n, 4); i <= 12; ++i) recurs(arr, n, i);
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); ++i) {
    printf("%d.%d.%d.%d\n", ans[i][0], ans[i][1], ans[i][2], ans[i][3]);
  }
  return 0;
}
