#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; using ll=long long; typedef pair P; template struct BIT{ vector bit; int size; BIT(int n):size(n), bit(n+1, 0){} T sum(int i){ //[0, i) T s=0; while(i>0){ s+=bit[i]; i-=(i&(-i)); } return s; } T sum(int l, int r){ //[l, r) return sum(r)-sum(l); } void add(int i, T x){ i++; while(i<=size){ bit[i]+=x; i+=(i&(-i)); } } }; int main() { int n, m; cin>>n>>m; int c[505][505]={}; for(int i=0; i>h>>w>>ci; h--; w--; c[h][w]=ci; } const ll INF=1e18; ll dp[2][505][505]; for(int i=0; i; priority_queue, greater> que; que.push({{0, 0}, {0, 0}}); int dx[4]={1, -1, 0, 0}, dy[4]={0, 0, 1, -1}; while(!que.empty()){ PP p=que.top(); que.pop(); int t=p.first.second, x=p.second.first, y=p.second.second; if(dp[t][x][y]=n || y1<0 || y1>=n) continue; if(dp[t][x1][y1]>dp[t][x][y]+c[x1][y1]+1){ dp[t][x1][y1]=dp[t][x][y]+c[x1][y1]+1; que.push({{dp[t][x1][y1], t}, {x1, y1}}); } if(t==0 && dp[1][x1][y1]>dp[0][x][y]+1){ dp[1][x1][y1]=dp[0][x][y]+1; que.push({{dp[1][x1][y1], 1}, {x1, y1}}); } } } cout<