#include <bits/stdc++.h>
using namespace std;
template <typename T>
T nextInt() {
  T x = 0, p = 1;
  char ch;
  do {
    ch = getchar();
  } while (ch <= ' ');
  if (ch == '-') {
    p = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (ch - '0');
    ch = getchar();
  }
  return x * p;
}
const int maxN = 3e5 + 10;
const int INF = (int)1e9;
const int mod = (int)1e9 + 7;
const long long LLINF = (long long)1e18;
struct pt {
  int x, y, idx;
  pt() {}
  pt(int x, int y, int idx) : x(x), y(y), idx(idx) {}
  bool operator<(const pt &p) const { return y > p.y || (y == p.y && x < p.x); }
};
pt p[maxN];
long long dist(long long xa, long long ya, long long xb, long long yb) {
  return (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb);
}
bool lies(int a, int b, int c) {
  long long A = p[a].y - p[b].y;
  long long B = p[b].x - p[a].x;
  long long C = -A * p[a].x - B * p[a].y;
  return A * p[c].x + B * p[c].y + C == 0;
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    int x, y;
    cin >> x >> y;
    p[i] = pt(x, y, i + 1);
  }
  sort(p, p + n);
  cout << p[0].idx << ' ' << p[1].idx << ' ';
  for (int i = 2; i < n; ++i) {
    if (lies(1, 0, i)) {
      continue;
    }
    cout << p[i].idx << '\n';
    return 0;
  }
  assert(false);
  return 0;
}
