#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  int id;
  Point() : x(), y() {}
  Point(int _x, int _y) : x(_x), y(_y) {}
  Point operator+(const Point &a) const { return Point(x + a.x, y + a.y); }
  Point operator-(const Point &a) const { return Point(x - a.x, y - a.y); }
  long long operator%(const Point &a) const {
    return 1LL * x * a.x + 1LL * y * a.y;
  }
  long long operator*(const Point &a) const {
    return 1LL * x * a.y - 1LL * y * a.x;
  }
  bool operator<(const Point &a) const {
    return x < a.x || (x == a.x && y < a.y);
  }
  void scan() { scanf("%d%d", &x, &y); }
};
Point minP;
bool cmp(const Point &a, const Point &b) {
  Point v = a - minP;
  Point u = b - minP;
  if (v * u != 0) return v * u > 0;
  return (v % v) < (u % u);
}
const int N = (int)1e5 + 10;
Point p[N];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    p[i].scan();
    p[i].id = i;
  }
  minP = *min_element(p, p + n);
  sort(p, p + n, cmp);
  int it = 1;
  while ((p[1] - p[0]) * (p[it] - p[0]) == 0) it++;
  vector<int> ans = {p[0].id, p[1].id, p[it].id};
  sort(ans.begin(), ans.end());
  for (int x : ans) printf("%d ", x + 1);
  return 0;
}
