///////////////////////////////////////////// Template /////////////////////////////////////////////
#![allow(non_snake_case, unused)]
use std::collections::*;

macro_rules! debug {
	($($v: expr),*) => { {
		use ::std::io::Write;
		$(let _ = write!(::std::io::stderr(), "{} = {:?} ", stringify!($v), $v);)*
		let _ = writeln!(::std::io::stderr(), "@ {}:{}", file!(), line!());
	} }
}
macro_rules! mat {
	($e:expr) => { $e };
	($e:expr; $d:expr $(; $ds:expr)*) => { vec![mat![$e $(; $ds)*]; $d] };
}
macro_rules! ok {
	($a:ident$([$i:expr])*.$f:ident()$(@$t:ident)*) => {
		$a$([$i])*.$f($($t),*)
	};
	($a:ident$([$i:expr])*.$f:ident($e:expr$(,$es:expr)*)$(@$t:ident)*) => { {
		let t = $e;
		ok!($a$([$i])*.$f($($es),*)$(@$t)*@t)
	} };
}
mod template {
	type I<'a> = ::std::iter::Peekable<::std::str::SplitWhitespace<'a>>;
	pub trait FromLn<'a> {
		fn fromln(&mut I<'a>) -> Self;
	}
	macro_rules! read_primitives {
		($($t:ty),*) => { $(
			impl<'a> FromLn<'a> for $t {
				fn fromln(it: &mut I<'a>) -> $t {
					it.next().unwrap_or_else(|| panic!("input mismatch")).parse().unwrap_or_else(|e| panic!("{}", e))
				}
			}
		)* }
	}
	read_primitives!(String, bool, f64, i32, i64, usize, u32, u64);
	impl<'a, T> FromLn<'a> for Vec<T> where T: for<'b> FromLn<'b> {
		fn fromln(it: &mut I) -> Vec<T> {
			let mut vs = vec![];
			while it.peek().is_some() {
				vs.push(T::fromln(it));
			}
			vs
		}
	}
	impl<'a> FromLn<'a> for Vec<char> {
		fn fromln(it: &mut I) -> Vec<char> {
			String::fromln(it).chars().collect()
		}
	}
	impl<'a> FromLn<'a> for Vec<u8> {
		fn fromln(it: &mut I) -> Vec<u8> {
			String::fromln(it).into()
		}
	}
	macro_rules! read_tuple {
		($($t:ident),*) => {
			impl<'a, $($t),*> FromLn<'a> for ($($t),*) where $($t: for<'b> FromLn<'b>),* {
				fn fromln(it: &mut I) -> ($($t),*) {
					($($t::fromln(it)),*)
				}
			}
		}
	}
	read_tuple!(A, B);
	read_tuple!(A, B, C);
	read_tuple!(A, B, C, D);
	pub trait Scanner {
		fn gets(&mut self) -> String;
		fn readln<T: for<'a> FromLn<'a>>(&mut self) -> T {
			let buf = self.gets();
			let mut it = buf.split_whitespace().peekable();
			let t = T::fromln(&mut it);
			if it.peek().is_some() { panic!("input mismatch") }
			t
		}
		fn readlns<T: for<'a> FromLn<'a>>(&mut self, n: usize) -> Vec<T> {
			(0..n).map(|_| self.readln()).collect()
		}
	}
	impl<R: ::std::io::BufRead> Scanner for R {
		fn gets(&mut self) -> String {
			let mut buf = String::new();
			let _ = self.read_line(&mut buf).unwrap_or_else(|e| panic!("{}", e));
			buf
		}
	}
	pub trait SetMin {
		fn setmin(&mut self, v: Self) -> bool;
	}
	impl<T> SetMin for T where T: PartialOrd {
		fn setmin(&mut self, v: T) -> bool {
			*self > v && { *self = v; true }
		}
	}
	pub trait SetMax {
		fn setmax(&mut self, v: Self) -> bool;
	}
	impl<T> SetMax for T where T: PartialOrd {
		fn setmax(&mut self, v: T) -> bool {
			*self < v && { *self = v; true }
		}
	}
}
use self::template::*;

fn main() {
	let stdin = std::io::stdin();
	let mut sc = stdin.lock();
	let (n, m) = sc.readln();
	let mut to = vec![false; n];
	let mut from = vec![false; n];
	for (a, b) in sc.readlns::<(usize, usize)>(m) {
		if a == 1 {
			to[b - 1] = true;
		}
		if b == n {
			from[a - 1] = true;
		}
	}
	if from.into_iter().zip(to.into_iter()).any(|(a, b)| a && b) {
		println!("POSSIBLE");
	} else {
		println!("IMPOSSIBLE");
	}
}


Measured memory_bytes: 8444