#include <bits/stdc++.h>

using namespace std;

#define ll long long
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<string> vs;
typedef vector<vs> vvs;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
typedef vector<pll> vpll;
typedef vector<vpll> vvpll;
typedef set<int> si;
typedef set<vi> svi;
typedef set<ll> sll;
typedef set<vll> svll;
typedef set<pii> spii;
typedef set<vpii> svpii;
typedef set<pll> spll;
typedef set<vpll> svpll;
typedef vector<si> vsi;
typedef vector<sll> vsll;
typedef vector<spii> vspii;
typedef vector<spll> vspll;
#define ft first
#define sc second
#define pb push_back
#define ins insert
#define io                            \
	ios_base::sync_with_stdio(false); \
	cin.tie(NULL);                    \
	cout.tie(NULL)
#define all(v) v.begin(), v.end()
#define Sort(v) sort(all(v))
#define sortarr(a, n) sort(a, a + n)
#define tt     \
	ll tc;     \
	cin >> tc; \
	while (tc--)
#define rep(var, start, end, interval) for (ll var = start; (interval > 0 and var < end) or (interval < 0 and var > end); var += interval)
#define each(x, v) for (auto x : v)
#define takearr0(a, n) rep(z, 0, n, 1) cin >> a[z];
#define takearr1(a, n) rep(z, 1, n + 1, 1) cin >> a[z];

const ll max_n = 2e3 + 5;
const ll inf = 1e16;

ll n, m, w;
vvll a;

vpll neighbours(pll p)
{
	vpll vec;
	if (p.ft > 0 and a[p.ft - 1][p.sc] >= 0)
		vec.pb({p.ft - 1, p.sc});
	if (p.ft < n - 1 and a[p.ft + 1][p.sc] >= 0)
		vec.pb({p.ft + 1, p.sc});
	if (p.sc > 0 and a[p.ft][p.sc - 1] >= 0)
		vec.pb({p.ft, p.sc - 1});
	if (p.sc < m - 1 and a[p.ft][p.sc + 1] >= 0)
		vec.pb({p.ft, p.sc + 1});
	return vec;
}

int main()
{
	io;
	cin >> n >> m >> w;
	a.resize(n);
	a.assign(n, vll(m));
	rep(i, 0, n, 1) takearr0(a[i], m);
	// each(vec, a)
	// {
	// 	each(x, vec) cout << setw(18) << x << " ";
	// 	cout << endl;
	// }
	// cout << endl;
	vvb v(n, vb(m, false));
	vvll dists(n, vll(m, inf));
	queue<pll> q;
	q.push({0, 0});
	v[0][0] = true;
	dists[0][0] = 0;
	while (!q.empty())
	{
		pll p = q.front();
		q.pop();
		vpll nb = neighbours(p);
		each(pr, nb) if (!v[pr.ft][pr.sc])
		{
			dists[pr.ft][pr.sc] = dists[p.ft][p.sc] + w;
			v[pr.ft][pr.sc] = true;
			q.push(pr);
		}
	}
	rep(i, 0, n, 1) rep(j, 0, m, 1) v[i][j] = false;
	vvll distt(n, vll(m, inf));
	q.push({n - 1, m - 1});
	v[n - 1][m - 1] = true;
	distt[n - 1][m - 1] = 0;
	while (!q.empty())
	{
		pll p = q.front();
		q.pop();
		vpll nb = neighbours(p);
		each(pr, nb) if (!v[pr.ft][pr.sc])
		{
			distt[pr.ft][pr.sc] = distt[p.ft][p.sc] + w;
			v[pr.ft][pr.sc] = true;
			q.push(pr);
		}
	}
	ll pors = inf, port = inf;
	rep(i, 0, n, 1) rep(j, 0, m, 1) if (a[i][j] > 0)
	{
		pors = min(pors, dists[i][j] + a[i][j]);
		port = min(port, distt[i][j] + a[i][j]);
	}
	ll ans = min(dists[n - 1][m - 1], pors + port);
	if (ans >= inf)
		cout << -1 << endl;
	else
		cout << ans << endl;
	return 0;
}