// Arup Guha
// 5/9/2018
// Solution to USACO 2015 January Silver Problem: Meeting

import java.util.*;
import java.io.*;

public class meeting {

	public static int n;

	public static void main(String[] args) throws Exception {

		// Read in data.
		BufferedReader stdin = new BufferedReader(new FileReader("meeting.in"));
		StringTokenizer tok = new StringTokenizer(stdin.readLine());
		n = Integer.parseInt(tok.nextToken());
		int numE = Integer.parseInt(tok.nextToken());

		// Form graphs.
		ArrayList[] bessie = new ArrayList[n];
		for (int i=0; i<n; i++) bessie[i] = new ArrayList<edge>();
		ArrayList[] elsie = new ArrayList[n];
		for (int i=0; i<n; i++) elsie[i] = new ArrayList<edge>();

		// Add edges.
		for (int i=0; i<numE; i++) {
			tok = new StringTokenizer(stdin.readLine());
			int v1 = Integer.parseInt(tok.nextToken())-1;
			int v2 = Integer.parseInt(tok.nextToken())-1;
			int wB = Integer.parseInt(tok.nextToken());
			int wE = Integer.parseInt(tok.nextToken());
			bessie[v1].add(new edge(v2,wB));
			elsie[v1].add(new edge(v2,wE));
		}

		boolean[][] dpBessie = go(bessie);
		boolean[][] dpElsie = go (elsie);

		// Find the time they can both make it.
		int res = -1;
		for (int i=0; i<dpBessie[0].length; i++) {
			if (dpBessie[n-1][i] && dpElsie[n-1][i]) {
				res = i;
				break;
			}
		}

		// Write result.
		PrintWriter out = new PrintWriter(new FileWriter("meeting.out"));
		if (res == -1)
			out.println("IMPOSSIBLE");
		else
			out.println(res);
		out.close();
		stdin.close();
	}

	public static boolean[][] go(ArrayList[] g) {

		// dp[i][j] = true iff we can get to vertex i in time j.
		boolean[][] dp = new boolean[n][100000];
		int[] max = new int[n];
		Arrays.fill(max, -1);
		dp[0][0] = true;
		max[0] = 0;

		// i is where we are going from.
		for (int i=0; i<n-1; i++) {

			// j is the current time; no need to go past max[i].
			for (int j=0; j<=max[i]; j++) {

				// A state we can build off of.
				if (dp[i][j]) {
					for (edge e: (ArrayList<edge>)g[i]) {
						dp[e.to][j+e.w] = true;
						max[e.to] = Math.max(max[e.to], j+e.w);
					}
				}
			}
		}

		return dp;

	}
}

class edge {
	public int to;
	public int w;

	public edge(int myv, int myw) {
		to = myv;
		w = myw;
	}
}