import java.io.*;
import java.util.*;
 
 
public class Main implements Runnable {
 
  public void run() {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  }
 
  public static void main(String[] args) {
    Main main = new Main();
    main.run();
  }
 
  // scanner slightly faster than usual ones
  public static class BetterScanner {
 
    private InputStream stream;
    private byte[] buffer = new byte[1024];
    private int pointer = 0;
    private int bufferLength = 0;
 
    public BetterScanner(InputStream stream) {
      this.stream = stream;
    }
 
    private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    }
 
    private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    }
 
    public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    }
 
    private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    }
 
    public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    }
 
    private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    }
 
  }
 
} import java.io.*; io.* java import java.util.*; util.* java public class Main implements Runnable {
 
  public void run() {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  }
 
  public static void main(String[] args) {
    Main main = new Main();
    main.run();
  }
 
  // scanner slightly faster than usual ones
  public static class BetterScanner {
 
    private InputStream stream;
    private byte[] buffer = new byte[1024];
    private int pointer = 0;
    private int bufferLength = 0;
 
    public BetterScanner(InputStream stream) {
      this.stream = stream;
    }
 
    private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    }
 
    private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    }
 
    public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    }
 
    private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    }
 
    public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    }
 
    private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    }
 
  }
 
} Main public void run() {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  } run {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  } BetterScanner scanner = new BetterScanner(System.in); scanner new BetterScanner(System.in) int n = scanner.nextInt(); n scanner.nextInt() scanner.nextInt scanner int[] tt = new int[n]; tt new int[n] n int[] xx = new int[n]; xx new int[n] n int[] yy = new int[n]; yy new int[n] n for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    } int i = 0 ; int i = 0 ; i 0 i < n i n i ++ i ++ i {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    } {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    } tt[i] = scanner.nextInt() tt[i] tt i scanner.nextInt() scanner.nextInt scanner xx[i] = scanner.nextInt() xx[i] xx i scanner.nextInt() scanner.nextInt scanner yy[i] = scanner.nextInt() yy[i] yy i scanner.nextInt() scanner.nextInt scanner int t = 0; t 0 int x = 0; x 0 int y = 0; y 0 for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    } int i = 0 ; int i = 0 ; i 0 i < n i n i ++ i ++ i {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    } {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    } int next_t = tt[i]; next_t tt[i] tt i int next_x = xx[i]; next_x xx[i] xx i int next_y = yy[i]; next_y yy[i] yy i int diff_t = next_t - t; diff_t next_t - t next_t t int diff_x = next_x - x; diff_x next_x - x next_x x int diff_y = next_y - y; diff_y next_y - y next_y y int rest = diff_t - diff_x - diff_y; rest diff_t - diff_x - diff_y diff_t - diff_x - diff_y diff_t diff_x diff_y if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      } rest < 0 || rest % 2 != 0 rest < 0 rest 0 rest % 2 != 0 rest % 2 rest 2 0 {
        System.out.println("No");
        return;
      } System.out.println("No") System.out.println System.out System System.out "No" return; t = next_t t next_t x = next_x x next_x y = next_y y next_y System.out.println("Yes") System.out.println System.out System System.out "Yes" return; public static void main(String[] args) {
    Main main = new Main();
    main.run();
  } main {
    Main main = new Main();
    main.run();
  } Main main = new Main(); main new Main() main.run() main.run main String[] args args public static class BetterScanner {
 
    private InputStream stream;
    private byte[] buffer = new byte[1024];
    private int pointer = 0;
    private int bufferLength = 0;
 
    public BetterScanner(InputStream stream) {
      this.stream = stream;
    }
 
    private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    }
 
    private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    }
 
    public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    }
 
    private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    }
 
    public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    }
 
    private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    }
 
  } BetterScanner private InputStream stream; stream private byte[] buffer = new byte[1024]; buffer new byte[1024] 1024 private int pointer = 0; pointer 0 private int bufferLength = 0; bufferLength 0 public BetterScanner(InputStream stream) {
      this.stream = stream;
    } BetterScanner {
      this.stream = stream;
    } this.stream = stream this.stream this this.stream stream InputStream stream stream private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    } updateBuffer {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    } if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      } pointer >= bufferLength pointer bufferLength {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } pointer = 0 pointer 0 try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        } catch (IOException exception) {
          exception.printStackTrace();
        } IOException exception {
          exception.printStackTrace();
        } exception.printStackTrace() exception.printStackTrace exception {
          bufferLength = stream.read(buffer);
        } bufferLength = stream.read(buffer) bufferLength stream.read(buffer) stream.read stream buffer return bufferLength > 0; bufferLength > 0 bufferLength 0 {
        return true;
      } return true; true private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    } read {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    } if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      } updateBuffer() updateBuffer {
        return buffer[pointer ++];
      } return buffer[pointer ++]; buffer[pointer ++] buffer pointer ++ pointer {
        return -1;
      } return -1; -1 1 public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    } hasNext {
      skipUnprintable();
      return updateBuffer();
    } skipUnprintable() skipUnprintable return updateBuffer(); updateBuffer() updateBuffer private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    } skipUnprintable { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    } while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      } updateBuffer() && !isPrintableChar(buffer[pointer]) updateBuffer() updateBuffer !isPrintableChar(buffer[pointer]) isPrintableChar(buffer[pointer]) isPrintableChar buffer[pointer] buffer pointer {
        pointer ++;
      } pointer ++ pointer public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    } next {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    } if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      } hasNext() hasNext {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } StringBuilder builder = new StringBuilder(); builder new StringBuilder() int codePoint = read(); codePoint read() read while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        } isPrintableChar(codePoint) isPrintableChar codePoint {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        } builder.appendCodePoint(codePoint) builder.appendCodePoint builder codePoint codePoint = read() codePoint read() read return builder.toString(); builder.toString() builder.toString builder {
        throw new NoSuchElementException();
      } throw new NoSuchElementException(); new NoSuchElementException() public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    } nextLong {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    } if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      } hasNext() hasNext {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } long number = 0; number 0 boolean minus = false; minus false int codePoint = read(); codePoint read() read if (codePoint == '-') {
          minus = true;
          codePoint = read();
        } codePoint == '-' codePoint '-' {
          minus = true;
          codePoint = read();
        } minus = true minus true codePoint = read() codePoint read() read if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        } codePoint >= '0' && codePoint <= '9' codePoint >= '0' codePoint '0' codePoint <= '9' codePoint '9' {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          } true {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          } if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            } codePoint >= '0' && codePoint <= '9' codePoint >= '0' codePoint '0' codePoint <= '9' codePoint '9' {
              number *= 10;
              number += codePoint - '0';
            } number *= 10 number 10 number += codePoint - '0' number codePoint - '0' codePoint '0' if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            } codePoint < 0 || !isPrintableChar(codePoint) codePoint < 0 codePoint 0 !isPrintableChar(codePoint) isPrintableChar(codePoint) isPrintableChar codePoint {
              return (minus) ? -number : number;
            } return (minus) ? -number : number; (minus) ? -number : number (minus) -number number number {
              throw new NumberFormatException();
            } throw new NumberFormatException(); new NumberFormatException() codePoint = read() codePoint read() read {
          throw new NumberFormatException();
        } throw new NumberFormatException(); new NumberFormatException() {
        throw new NoSuchElementException();
      } throw new NoSuchElementException(); new NoSuchElementException() public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    } nextInt {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    } long number = nextLong(); number nextLong() nextLong if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      } number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE number >= Integer.MIN_VALUE number Integer.MIN_VALUE Integer Integer.MIN_VALUE number <= Integer.MAX_VALUE number Integer.MAX_VALUE Integer Integer.MAX_VALUE {
        return (int)number;
      } return (int)number; (int)number {
        throw new NumberFormatException();
      } throw new NumberFormatException(); new NumberFormatException() private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    } isPrintableChar {
      return codePoint >= 33 && codePoint <= 126;
    } return codePoint >= 33 && codePoint <= 126; codePoint >= 33 && codePoint <= 126 codePoint >= 33 codePoint 33 codePoint <= 126 codePoint 126 int codePoint codePoint Runnable public class Main implements Runnable {
 
  public void run() {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  }
 
  public static void main(String[] args) {
    Main main = new Main();
    main.run();
  }
 
  // scanner slightly faster than usual ones
  public static class BetterScanner {
 
    private InputStream stream;
    private byte[] buffer = new byte[1024];
    private int pointer = 0;
    private int bufferLength = 0;
 
    public BetterScanner(InputStream stream) {
      this.stream = stream;
    }
 
    private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    }
 
    private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    }
 
    public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    }
 
    private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    }
 
    public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    }
 
    private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    }
 
  }
 
} public class Main implements Runnable {
 
  public void run() {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  }
 
  public static void main(String[] args) {
    Main main = new Main();
    main.run();
  }
 
  // scanner slightly faster than usual ones
  public static class BetterScanner {
 
    private InputStream stream;
    private byte[] buffer = new byte[1024];
    private int pointer = 0;
    private int bufferLength = 0;
 
    public BetterScanner(InputStream stream) {
      this.stream = stream;
    }
 
    private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    }
 
    private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    }
 
    public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    }
 
    private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    }
 
    public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    }
 
    private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    }
 
  }
 
} Main
import java.io.*;
import java.util.*;
 
 
public class Main implements Runnable {
 
  public void run() {
    BetterScanner scanner = new BetterScanner(System.in);
    int n = scanner.nextInt();
    int[] tt = new int[n];
    int[] xx = new int[n];
    int[] yy = new int[n];
    for (int i = 0 ; i < n ; i ++) {
      tt[i] = scanner.nextInt();
      xx[i] = scanner.nextInt();
      yy[i] = scanner.nextInt();
    }

    int t = 0;
    int x = 0;
    int y = 0;
    for (int i = 0 ; i < n ; i ++) {
      int next_t = tt[i];
      int next_x = xx[i];
      int next_y = yy[i];
      int diff_t = next_t - t;
      int diff_x = next_x - x;
      int diff_y = next_y - y;
      int rest = diff_t - diff_x - diff_y;
      if (rest < 0 || rest % 2 != 0) {
        System.out.println("No");
        return;
      }
      t = next_t;
      x = next_x;
      y = next_y;
    }
    System.out.println("Yes");
    return;
  }
 
  public static void main(String[] args) {
    Main main = new Main();
    main.run();
  }
 
  // scanner slightly faster than usual ones
  public static class BetterScanner {
 
    private InputStream stream;
    private byte[] buffer = new byte[1024];
    private int pointer = 0;
    private int bufferLength = 0;
 
    public BetterScanner(InputStream stream) {
      this.stream = stream;
    }
 
    private boolean updateBuffer() {
      if (pointer >= bufferLength) {
        pointer = 0;
        try {
          bufferLength = stream.read(buffer);
        } catch (IOException exception) {
          exception.printStackTrace();
        }
        return bufferLength > 0;
      } else {
        return true;
      }
    }
 
    private int read() {
      if (updateBuffer()) {
        return buffer[pointer ++];
      } else {
        return -1;
      }
    }
 
    public boolean hasNext() {
      skipUnprintable();
      return updateBuffer();
    }
 
    private void skipUnprintable() { 
      while (updateBuffer() && !isPrintableChar(buffer[pointer])) {
        pointer ++;
      }
    }
 
    public String next() {
      if (hasNext()) {
        StringBuilder builder = new StringBuilder();
        int codePoint = read();
        while (isPrintableChar(codePoint)) {
          builder.appendCodePoint(codePoint);
          codePoint = read();
        }
        return builder.toString();
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public long nextLong() {
      if (hasNext()) {
        long number = 0;
        boolean minus = false;
        int codePoint = read();
        if (codePoint == '-') {
          minus = true;
          codePoint = read();
        }
        if (codePoint >= '0' && codePoint <= '9') {
          while (true) {
            if (codePoint >= '0' && codePoint <= '9') {
              number *= 10;
              number += codePoint - '0';
            } else if (codePoint < 0 || !isPrintableChar(codePoint)) {
              return (minus) ? -number : number;
            } else {
              throw new NumberFormatException();
            }
            codePoint = read();
          }
        } else {
          throw new NumberFormatException();
        }
      } else {
        throw new NoSuchElementException();
      }
    }
 
    public int nextInt() {
      long number = nextLong();
      if (number >= Integer.MIN_VALUE && number <= Integer.MAX_VALUE) {
        return (int)number;
      } else {
        throw new NumberFormatException();
      }
    }
 
    private boolean isPrintableChar(int codePoint) {
      return codePoint >= 33 && codePoint <= 126;
    }
 
  }
 
}