#include <bits/stdc++.h>
using namespace std;
using ld = long double;
const double eps = 1e-8;
const double inf = 1e20;
const double pi = acos(-1.0);
int sgn(double x) {
if (fabs(x) < eps)
return 0;
if (x < 0)
return -1;
else
return 1;
}
struct Point {
double x, y;
Point() {}
Point(double _x, double _y) : x(_x), y(_y) {}
void input() { cin >> x >> y; }
void output() { cerr << fixed << setprecision(5) << x << " " << y << '\n'; }
bool operator==(Point b) const { return sgn(x - b.x) == 0 && sgn(y - b.y) == 0; }
bool operator<(Point b) const { return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : sgn(x - b.x) < 0; }
Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }
Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
Point operator*(const double &k) const { return Point(x * k, y * k); }
Point operator/(const double &k) const { return Point(x / k, y / k); }
double operator*(const Point &b) const { return x * b.x + y * b.y; }
double operator^(const Point &b) const { return x * b.y - y * b.x; }
int quad() const {
if (x > 0 && y >= 0)
return 1;
if (x <= 0 && y > 0)
return 2;
if (x < 0 && y <= 0)
return 3;
if (x >= 0 && y < 0)
return 4;
return 5;
}
double len() { return hypot(x, y); }
double len2() { return x * x + y * y; }
double dis(Point b) { return hypot(x - b.x, y - b.y); }
double cross(Point a, Point b) {
Point p = {x, y};
return (a - p) ^ (b - p);
}
double dot(Point a, Point b) {
Point p = {x, y};
return (a - p) * (b - p);
}
double rad(Point a, Point b) {
Point p = *this;
return fabs(atan2(fabs((a - p) ^ (b - p)), (a - p) * (b - p)));
}
double ang(Point a, Point b) {
return rad(a, b) / pi * 180.0;
}
Point rotleft() { return Point(-y, x); }
Point rotright() { return Point(y, -x); }
Point rotate(Point p, double angle) {
Point v = (*this) - p;
double c = cos(angle);
double s = sin(angle);
return Point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);
}
};
struct Line {
Point u, v;
Line() {}
Line(Point _u, Point _v) : u(_u), v(_v) {}
bool operator==(Line l) { return (u == l.u) && (v == l.v); }
Line(Point p, double angle) {
u = p;
if (sgn(angle - pi / 2) == 0)
v = u + Point(0, 1);
else
v = u + Point(1, tan(angle));
}
Line(double a, double b, double c) {
if (sgn(a) == 0) {
u = Point(0, -c / b);
v = Point(1, -c / b);
} else if (sgn(b) == 0) {
u = Point(-c / a, 0);
v = Point(-c / a, 1);
} else {
u = Point(0, -c / b);
v = Point(1, (-c - a) / b);
}
}
void input() { u.input(), v.input(); }
void adjust() {
if (v < u)
swap(u, v);
}
double len() { return u.dis(v); }
Point dir() { return v - u; }
double rad() {
double theta = atan2(v.y - u.y, v.x - u.x);
if (sgn(theta) < 0)
theta += pi;
if (sgn(theta - pi) == 0)
theta -= pi;
return theta;
}
int relation(Point p) {
int c = sgn((p - u) ^ (v - u));
if (c < 0)
return 1;
else if (c > 0)
return 2;
else {
if (sgn((p - u) * (p - v)) <= 0)
return 3;
if (sgn((p - u) * (v - u)) > 0)
return 4;
else
return 5;
}
}
int linecrossline(Line l) {
if (sgn((v - u) * (l.v - l.u)) == 0)
return 2;
if (sgn((v - u) ^ (l.v - l.u)) == 0)
return l.relation(u) > 2;
return 3;
}
int segcrossseg(Line l) {
int d1 = sgn((v - u) ^ (l.u - u));
int d2 = sgn((v - u) ^ (l.v - u));
int d3 = sgn((l.v - l.u) ^ (u - l.u));
int d4 = sgn((l.v - l.u) ^ (v - l.u));
if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2)
return 2;
return (d1 == 0 && sgn((l.u - u) * (l.u - v)) <= 0) ||
(d2 == 0 && sgn((l.v - u) * (l.v - v)) <= 0) ||
(d3 == 0 && sgn((u - l.u) * (u - l.v)) <= 0) ||
(d4 == 0 && sgn((v - l.u) * (v - l.v)) <= 0);
}
int linecrossseg(Line seg) {
int d1 = sgn((v - u) ^ (seg.u - u));
int d2 = sgn((v - u) ^ (seg.v - u));
if ((d1 ^ d2) == -2)
return 2;
return (d1 == 0 || d2 == 0);
}
Point crosspoint(Line l) {
double a1 = (l.v - l.u) ^ (u - l.u);
double a2 = (l.v - l.u) ^ (v - l.u);
Point p = {(u.x * a2 - v.x * a1) / (a2 - a1), (u.y * a2 - v.y * a1) / (a2 - a1)};
p.x = fabs(p.x) < eps ? 0 : p.x;
p.y = fabs(p.y) < eps ? 0 : p.y;
return p;
}
double dispointtoline(Point p) {
return fabs((p - u) ^ (v - u)) / len();
}
double dispointtoseg(Point p) {
if (sgn((p - u) * (v - u)) < 0 || sgn((p - v) * (u - v)) < 0)
return min(p.dis(u), p.dis(v));
return dispointtoline(p);
}
double dissegtoseg(Line l) {
if (segcrossseg(l))
return 0;
return min(min(dispointtoseg(l.u), dispointtoseg(l.v)),
min(l.dispointtoseg(u), l.dispointtoseg(v)));
}
Point project(Point p) {
return u + (((v - u) * ((v - u) * (p - u))) / ((v - u).len2()));
}
Point symmetry(Point p) {
Point q = project(p);
return Point(2 * q.x - p.x, 2 * q.y - p.y);
}
};
void solve() {
Point o, d;
o.input(), d.input();
Line l = {o, o + d};
int n;
cin >> n;
vector<Line> seg(n + 1);
vector<double> k(n + 1);
for (int i = 1; i <= n; i++) {
seg[i].input();
double a, b;
cin >> a >> b;
k[i] = a / b;
}
vector<int> ans;
for (int j = 1; j <= 10; j++) {
double minn = inf;
int id = 0;
for (int i = 1; i <= n; i++) {
Point s = seg[i].dir();
if (sgn(s ^ d) == 0)
continue;
if (l.linecrossseg(seg[i]) == 0) {
continue;
}
Point t = l.crosspoint(seg[i]);
int _ = l.relation(t);
if (_ == 5)
continue;
if (d * (t - o) > 0) {
double dis = o.dis(t);
if (dis < minn) {
minn = dis;
id = i;
}
}
}
if (id == 0)
break;
ans.push_back(id);
Point t = l.crosspoint(seg[id]);
if (l.linecrossline(seg[id]) == 2) {
d = d * (-1);
} else {
Point segdir = seg[id].dir();
if (sgn(d * segdir) < 0)
segdir = segdir * (-1);
double alpha = pi / 2 - o.rad(o + segdir, t);
double beta = k[id] * alpha;
int op = sgn(segdir ^ d);
d = d * (-1);
if (op == 1)
d = d.rotate({0, 0}, (alpha + beta));
else
d = d.rotate({0, 0}, 2 * pi - alpha - beta);
}
o = t;
l = {o, o + d};
}
if (ans.size() == 0) {
cout << "NONE\n";
} else {
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << " \n"[i == ans.size() - 1];
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}