/***************************************************************
	File name: D.cpp
	Author: ljfcnyali
	Create time: 2021年02月21日 星期日 21时00分33秒
***************************************************************/
#include<bits/stdc++.h>

using namespace std;

#define REP(i, a, b) for ( int i = (a), _end_ = (b); i <= _end_; ++ i ) 
#define mem(a) memset ( (a), 0, sizeof ( a ) ) 
#define str(a) strlen ( a ) 
#define pii pair<int, int>
#define int long long
typedef long long LL;

const int maxn = 1e5 + 10;
const int Mod = 998244353;

int n, m, k, ans;

inline int power(int a, int b) { int r = 1; while ( b ) { if ( b & 1 ) r = r * a % Mod; a = a * a % Mod; b >>= 1; } return r; } 

signed main()
{
	scanf("%lld%lld%lld", &n, &m, &k);	
	if ( n == 1 || m == 1 ) 
	{
		printf("%lld\n", power(k, n + m - 1));
		return 0; 
	}
	REP(i, 1, k) ans = (ans + (power(i, n) - power(i - 1, n)) * power(k - i + 1, m)) % Mod;
	printf("%lld\n", (ans + Mod) % Mod);
    return 0;
}

#include<bits/stdc++.h>
using namespace std;

struct{template<class T>constexpr operator T(){return numeric_limits<T>::max();}constexpr auto operator-();}inf;
struct{template<class T>constexpr operator T(){return numeric_limits<T>::lowest();}constexpr auto operator-();}negative_inf;
constexpr auto decltype(inf)::operator-(){return negative_inf;}
constexpr auto decltype(negative_inf)::operator-(){return inf;}

#define swap(a,b) {a^=b;b^=a;a^=b;}
#define rep(i,n) for(long long i = 0; i < n; i++)
#define reps(i,s,n) for(long long i = (s); i < n; i++)
#define repr(i,n) for(long long i = (n - 1); i >= 0; i--)
#define LOOP for(long long i = 0;;i++)
#define PB push_back
#define ALL(v) v.begin(),v.end()
#define DOUBLE fixed << setprecision(15)

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<long long> vll;
typedef vector<double> vd;
typedef vector<char> vc;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef vector<vvll> vvvll;
typedef vector<vd> vvd;
typedef vector<vc> vvc;
typedef vector<vb> vvb;
typedef pair<ll,ll> P;
typedef vector<P> vP;

#define F first
#define S second
#define SPC << " "

ll gcd(ll x,ll y){if(x<=0||y<=0)return 0;if(y>x){swap(x,y);}return x%y==0?y:gcd(y,x%y);}
ll lcm(ll x,ll y){return x*y/gcd(x,y);}
ll factrial(int x){return x<=1?1:x*factrial(x-1);}
ll nPr(ll n,ll r){ll a=1;rep(i,n-r)a*=(n-i);return a;}
ll nCr(ll n,ll r){ll a=1;rep(i,r){a*=(n-i);a/=(i+1);}return a;}
vP factor(ll n){vP r;if(n<=1)return{};ll m=pow(n,0.5)+1;reps(i,2,m){if(n%i==0){ll c=0;
  while(n%i==0){c++;n/=i;}r.PB({i,c});}if(n<=1)break;}if(n>1)r.PB({n,1});return r;}

bool mycmp(P &a, P &b){
  return a.F < b.F;
}
bool mycmp2(pair<ll,P> &a, pair<ll,P> &b){
  return a.F > b.F;
}

int main(){
  ll n;
  cin >> n;
  vP px(n), py(n);
  rep(i,n){
    cin >> px[i].F >> py[i].F;
    px[i].S = i;
    py[i].S = i;
  }
  sort(ALL(px), mycmp);
  sort(ALL(py), mycmp);
  ll dx, dy, dx0, dxn, dy0, dyn;
  dx = px[n-1].F - px[0].F;
  dy = py[n-1].F - py[0].F;
  dx0 = px[n-1].F - px[1].F;
  dxn = px[n-2].F - px[0].F;
  dy0 = py[n-1].F - py[1].F;
  dyn = py[n-2].F - py[0].F;
  if(px[0].S == py[0].S && px[n-1].S == py[n-1].S){
    cout << max(max(dx0,dxn), max(dy0,dyn)) << endl;
  }else{
    vll d = {dx, dx0, dxn, dy, dy0, dyn};
    sort(ALL(d));
    cout << d[4] << endl;
  }
}