#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T>
T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <typename T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <typename T>
T pow(T a, int b) {
  return b ? pow(a * a, b / 2) * (b % 2 ? a : 1) : 1;
}
const int mod = 998244353;
long long modpow(long long a, int b) {
  return b ? modpow(a * a % mod, b / 2) * (b % 2 ? a : 1) % mod : 1;
}
void solve();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int T;
  T = 1;
  while (T--) {
    solve();
  }
}
struct UnionFind {
  vector<double> data;
  int sz;
  UnionFind(int _sz) : data(_sz, -1) { sz = _sz; }
  bool connect(int x, int y) {
    if ((x = root(x)) == (y = root(y))) return false;
    if (data[x] > data[y]) swap(x, y);
    data[x] += data[y];
    data[y] = x;
    sz--;
    return true;
  }
  bool issame(int x, int y) { return root(x) == root(y); }
  int root(int x) { return data[x] < 0 ? x : data[x] = root(data[x]); }
  int size(int x) { return -data[root(x)]; }
  int size() { return sz; }
};
void solve() {
  int n;
  cin >> n;
  set<int> s;
  for (int i = 0; i < (n); ++i) {
    int b;
    cin >> b;
    s.insert(b);
  }
  vector<int> a;
  for (auto e : s) a.emplace_back(e);
  sort(a.begin(), a.end());
  map<long long, int> mp;
  for (int i = 0; i < (n); ++i) mp[a[i]] = i + 1;
  for (int i = 0; i < (33); ++i) {
    UnionFind uni(n);
    for (int j = 0; j < (n - 1); ++j) {
      long long num = a[j] + pow(2LL, i);
      if (mp.count(num)) {
        uni.connect(j, mp[num] - 1);
      }
    }
    vector<vector<int> > v(n);
    for (int j = 0; j < (n); ++j) {
      v[uni.root(j)].emplace_back(a[j]);
    }
    for (int j = 0; j < (n); ++j) {
      if ((int)v[j].size() >= 3) {
        cout << 3 << endl;
        for (int k = 0; k < (3); ++k) cout << v[j][k] << " ";
        cout << endl;
        return;
      }
    }
  }
  for (int i = 0; i < (33); ++i) {
    UnionFind uni(n);
    for (int j = 0; j < (n - 1); ++j) {
      long long num = a[j] + pow(2LL, i);
      if (mp.count(num)) {
        uni.connect(j, mp[num] - 1);
      }
    }
    vector<vector<int> > v(n);
    for (int j = 0; j < (n); ++j) {
      v[uni.root(j)].emplace_back(a[j]);
    }
    for (int j = 0; j < (n); ++j) {
      if ((int)v[j].size() >= 2) {
        cout << 2 << endl;
        for (int k = 0; k < (2); ++k) cout << v[j][k] << " ";
        cout << endl;
        return;
      }
    }
  }
  cout << 1 << endl;
  cout << a[0] << endl;
}
