void main(){
	long n = _scan!long();
	long[] stat = [0, 0, 0];
	bool legitimate_travel = true;
	foreach(i; 0..n){
		long[] tmp_stat = _scanln!long();
		long tdif = tmp_stat[0] - stat[0]; // 所要時間
		long xdif = abs( tmp_stat[1] - stat[1] ); // x方向移動距離
		long ydif = abs( tmp_stat[2] - stat[2] ); // y方向移動距離
		// 移動可能判定
		if( xdif+ydif <= tdif ){
			// tdifで移動できる範囲である
			if( tdif%2 == (xdif+ydif)%2 ){
				// かつ, 余らず移動できるか
				stat = tmp_stat; // 移動できれば位置を変更
			}else legitimate_travel = false;
		}else legitimate_travel = false;
		
		if(legitimate_travel == false)break;
	}
	writeln(legitimate_travel?"Yes":"No");
}

import std.stdio, std.conv, std.algorithm, std.numeric, std.string, std.math;

// 1要素のみの入力
T _scan(T= int)(){
	return to!(T)( readln().chomp() );
}

// 1行に同一型の複数入力
T[] _scanln(T = int)(){
	T[] ln;
	foreach(string elm; readln().chomp().split()){
		ln ~= elm.to!T();
	}
	return ln;
}
