#include <iostream>
#include <cmath>
#include <vector>
#define MAX_Y 10000;
using namespace std;
struct slide {
	double x1;
	double y1;
	double x2;
	double y2;
};
//высота соприкосновения капли с крышей [ур-ние прямой по 2-м точкам]
double f (slide x, double x0) {
	double dx = x.x2 - x.x1;
	double dy = x.y2 - x.y1;
	return ((dy*(x0 - x.x1))/dx + x.y1);
}

vector <slide> roof; //вектор всех крыш

//считывание и заполнение данных
void read (int n) {
	while (n--) {
		double a, b, c, d;
		slide x;
		cin >> a >> b >> c >> d;
		if (a < c) {
			x.x1 = a;
			x.y1 = b;
			x.x2 = c;
			x.y2 = d;
		}
		else
		{
			x.x1 = c;
			x.y1 = d;
			x.x2 = a;
			x.y2 = b;
		}
		roof.push_back(x);
	}
}

int main() {
	int n, x, y = MAX_Y + 1;
	slide a;
	cin >> x >> n;
	if (n == 0) {
		cout << x;
		return 0;
	}
	read (n);
	while (roof.size()) {
		int index = -1;
		int value = -1; //предполагаемая высока соприкосновения капли со следующей крышей
		bool no_projection = true;
		for (int i = 0; i < roof.size(); i++) { //поиск самой высокой крыши в точке х
			if ((x <= roof[i].x2) and (x >= roof[i].x1)) { //капля проектируется на и-тую крышу?
				no_projection = false;
				if ((f(roof[i], x) > value) and (f(roof[i], x) < y)) { //и-тая крыша выше ранее найденной?
					value = f(roof[i], x);
					index = i;
				}
			}
			if (min(roof[i].y1, roof[i].y2) > y) {  //крыша целиком осталась выше?
				roof.erase(roof.begin() + i);
				i--;
			}
		}
		if ((roof.size() == 0) or (no_projection)) {  //если удалили все крыши или свободно падает на землю
			cout << x;
			return 0;
		}
		if (roof[index].y1 < roof[index].y2)  //какой конец крыши ниже?
			x = roof[index].x1;
		else
			x = roof[index].x2;
		y = min(roof[index].y1, roof[index].y2); //сохранили новую ординату
		roof.erase(roof.begin() + index);
	}
	cout << x;
	return 0;
}