```cpp=
class Solution {
public:
int shortestPath(vector<vector<int>>& grid, int k) {
int dx[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
int n = grid.size();
int m = grid[0].size();
int inf = 1e9;
vector<vector<int>> dist ( n, vector<int>(m, inf) );
dist[0][0] = 0;
priority_queue<vector<int>, vector<vector<int>>, greater<vector<int>>> pq;
pq.push( { grid[0][0], 0, 0, 0 } );
while ( !pq.empty() ) {
vector<int> currNode = pq.top();
pq.pop();
int curK = currNode[0];
int d = currNode[1];
int x = currNode[2];
int y = currNode[3];
if ( d > dist[x][y] ) continue;
for ( int i = 0; i < 4; i++ ) {
int x1 = x + dx[i];
int y1 = y + dy[i];
if ( x1 >= 0 && x1 < n && y1 >= 0 && y1 < m ) {
if ( 1 + d < dist[x1][y1] && grid[x1][y1] + curK <= k ) {
dist[x1][y1] = d + 1;
pq.push( {grid[x1][y1] + curK, dist[x1][y1], x1, y1} );
}
}
}
}
if ( dist[n-1][m-1] == inf ) dist[n-1][m-1] = -1;
return dist[n-1][m-1];
}
};
```