镜面折跃
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 128 M,其他语言256 M
64bit IO Format: %lld

题目描述

一个 nm列的网格,其中左上角是 (1,1) ,右下角是 (n,m)

某些位置上存在一些镜子,镜子能将某个方向射来的光线折射 90° 再射出。

镜子只有以下两种状态。

镜子位于主对角线(两端位于左上和右下)。此时它可以产生如下效果:

1、将上方射来的光线从右侧射出

2、将右侧射来的光线从上方射出

3、将左侧射来的光线从下方射出

4、将下方射来的光线从左侧射出

镜子位于副对角线(两端位于左下和右上)。此时它可以产生如下效果:

1、将上方射来的光线从左侧射出

2、将左侧射来的光线从上方射出

3、将右侧射来的光线从下方射出

4、将下方射来的光线从右侧射出

如下图,黑线代表位于副对角线的镜子,蓝线代表光线。



你可以花费一个代价将某一面镜子向任意方向旋转 90°。

现在从格点 (1,1) 左侧射入一条光线,我们希望它能从格点 (n,m) 的右侧射出,请问最少要花费多少代价?

假设多条光线相交互不干扰。

输入描述:

第一行三个整数 n,m,k ,分别表示网格的行数、列数、镜子的数量。

接下来 k 行,每行三个整数 x_i,y_i,z_i

其中 x_i,y_i 表示第 i 个镜子所在的位置坐标为(x_i,y_i)z_i=0 表示该镜子位于主对角线(两端位于左上和右下),z_i=1 表示该镜子位于副对角线(两端位于左下和右上)。

输出描述:

输出让从 (1,1) 左侧射入的光线最终从 (n,m) 右侧射出的最小代价。

如果无法实现,输出 -1
示例1

输入

复制
3 5 2
1 3 0
3 3 1

输出

复制
1

说明

1\leq n,m\leq 500

0\leq k\leq n*m

样例一的初始状态:



样例一的最终状态: