#include using namespace std; const int inf = 0x3f3f3f3f; const int N = 505; struct node { int x, y; node() { } node(int _x, int _y) { x = _x; y = _y; } } p[N], a[N]; inline int get(node a, node b) { return a.x * b.y - b.x * a.y; } inline bool judge(node a, node b, node c) { return c.x >= min(a.x, b.x) && c.x <= max(a.x, b.x) && c.y >= min(a.y, b.y) && c.y <= max(a.y, b.y); } int G[N][N]; int main() { ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; while (cin >> n) { for (int i = 1; i <= n; ++i) { cin >> a[i].x >> a[i].y; } cin >> m; for (int i = 1; i <= m; ++i) { cin >> p[i].x >> p[i].y; } memset(G, inf, sizeof G); for (int i = 1; i <= m; ++i) { for (int j = 1; j <= m; ++j) { bool flag = true; int tmp; node t(p[i].x - p[j].x, p[i].y - p[j].y); for (int k = 1; k <= n; ++k) { tmp = get(t, node(p[i].x - a[k].x, p[i].y - a[k].y)); if (tmp < 0 || (tmp == 0 && !judge(p[i], p[j], a[k]))) { flag = false; break; } } if (flag) { G[i][j] = 1; } } } for (int k = 1; k <= m; ++k) { for (int i = 1; i <= m; ++i) { if (G[i][k] != inf) { for (int j = 1; j <= m; ++j) { G[i][j] = min(G[i][j], G[i][k] + G[k][j]); } } } } int res = inf; for (int i = 1; i <= m; ++i) { res = min(res, G[i][i]); } if (res >= inf) { cout << "ToT\n"; } else { cout << m - res << '\n'; } } return 0; }