#define _USE_MATH_DEFINES
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include<iostream>
#include<unordered_set>

using namespace std;

#define dprint(Exp,...) if(Exp){fprintf(stderr, __VA_ARGS__);}
#define printe(...) fprintf(stderr, __VA_ARGS__);
//#define printe(...) void();
#define printE(...) fprintf(stderr, __VA_ARGS__);
//#define printE(...) void();


#define PrtExp(_Exp)  cerr<< #_Exp <<" = "<< (_Exp)
#define PrtExpN(_Exp)  cerr<< #_Exp <<" = "<< (_Exp) <<"\n"

#define SINT(n) scanf("%d",&n)
#define SINT2(n,m) scanf("%d %d",&n,&m)
#define SINT3(n,m,o) scanf("%d %d %d",&n,&m,&o)
#define SINT4(n,m,o,P) scanf("%d %d %d %d",&n,&m,&o,&P)
#define SINT5(n,m,o,P,q) scanf("%d %d %d %d %d",&n,&m,&o,&P,&q)
#define SLL(n) scanf("%lld",&n)
#define SLL2(n,m) scanf("%lld %lld",&n,&m)
#define SLL3(n,m,o) scanf("%lld %lld %lld",&n,&m,&o)
#define SST(s) scanf("%s",s)
#define SCH(c) scanf("%c",&c)

#define GC() getchar()

#define PINT(n) printf("%d",(int)(n))
#define PINT2(n,m) printf("%d %d",(int)(n),(int)(m))
#define PINT3(n,m,l) printf("%d %d %d",(int)(n),(int)(m),(int)(l))
#define PLL(n) printf("%lld",(long long)(n))
#define PST(s) printf("%s",(s))
#define PCH(s) printf("%c",(s))

#define PINTN(n) printf("%d\n",(int)(n))
#define PINT2N(n,m) printf("%d %d\n",(int)(n),(int)(m))
#define PINT3N(n,m,l) printf("%d %d %d\n",(int)(n),(int)(m),(int)(l))
#define PLLN(n) printf("%lld\n",(long long)(n))
#define PSTN(s) printf("%s\n",(s))
#define PCHN(s) printf("%c\n",(s))

#define PSP() printf(" ")
#define PN() printf("\n")

#define PC(c) putchar(c)
#define CSP (' ')
#define SN ("\n")

#define rep(i,a) for(int i=0;i<a;i++)
#define reP(i,a) for(int i=0;i<=a;i++)
#define Rep(i,a) for(int i=a-1;i>=0;i--)
#define ReP(i,a) for(int i=a;i>=0;i--)

#define rEp(i,a) for(i=0;i<a;i++)
#define rEP(i,a) for(i=0;i<=a;i++)
#define REp(i,a) for(i=a-1;i>=0;i--)
#define REP(i,a) for(i=a;i>=0;i--)

#define repft(i,a,b) for(int i=a;i<b;i++)
#define repfT(i,a,b) for(int i=a;i<=b;i++)
#define Repft(i,a,b) for(int i=a-1;i>=b;i--)
#define RepfT(i,a,b) for(int i=a;i>=b;i--)

#define foreach(a,it) for(auto it = a.begin(); it != a.end(); ++it)

#define FILL(a,v) fill(begin(a),end(a), v)
#define FILL0(a) memset(a,0,sizeof(a))
#define FILL1(a) memset(a,-1,sizeof(a))

typedef long long ll;

typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll>   Pll;


const int INF = 1'010'000'000; // 0x3C33'6080
const ll INFLL = 0x1f1f1f1f1f1f1f1fLL;//2,242,545,357,980,376,863

template <class A, class B> inline ostream& operator<<(ostream& st, const pair<A, B>& P) { return st << "(" << P.first << "," << P.second << ")"; };
template <class A, class B> inline pair<A, B> operator+(const pair<A, B>& P, const pair<A, B>& Q) { return pair<A, B>(P.first + Q.first, P.second + Q.second); };
template <class A, class B> inline pair<A, B> operator-(const pair<A, B>& P, const pair<A, B>& Q) { return pair<A, B>(P.first - Q.first, P.second - Q.second); };

#define fs  first
#define sc  second

int bitCount(unsigned int bits) {
	bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);    //  2bitごとに計算
	bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);    //  4bitごとに計算
	bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);    //  8bitごとに計算
	bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);    //  16ビットごとに計算   
	return (bits & 0x0000ffff) + (bits >> 16);    //  32ビット分を計算   
}


int x[2003];
int y[2003];
int z[2003];
bool used[2003];

vector<Pi> G[2003];
vector<int> d;

void dfs(int i, int pre, bool f = false) {
	if(!f) used[i] = true;

	for (auto&p : G[i]) {
		if (p.first == pre) continue;
		if (used[p.first]) continue;
		d.push_back(p.second);
		return dfs(p.first, i);
	}
}

int main() {
	int n, k, s;
	while (cin >> n >> k >> s, n) {
		rep(i, n) cin >> x[i] >> y[i] >> z[i];
		rep(i, n) G[i].clear();
		rep(i, n) used[i] = false;

		if (k == 1) {
			cout << s*s * 6 << endl;
			continue;
		}
		int km1 = k - 1;

		rep(i, n) repft(j, i + 1, n) {
			int dx = abs(x[i] - x[j]);
			int dy = abs(y[i] - y[j]);
			int dz = abs(z[i] - z[j]);
			if (dx >= s || dy >= s || dz >= s) continue;
			dx = s - dx;
			dy = s - dy;
			dz = s - dz;
			int v = (dx * dy + dy * dz + dz * dx)*2;
			G[i].emplace_back(j, v);
			G[j].emplace_back(i, v);
		}
		int ret = 0;
		rep(i, n) {
			if (used[i]) continue;
			if (G[i].size() != 1) continue;
			d.clear();
			dfs(i, -1);
			int s = 0;
			//cout << "$"; for (auto&p : d) cout << " " << p; cout << endl;
			
			if (d.size() < km1)continue;
			rep(i, km1) s += d[i];
			ret = max(ret, s);
			for (int i = km1; i < d.size(); ++i) {
				s -= d[i - km1];
				s += d[i];
				ret = max(ret, s);
			}
			/*
			rep(i, d.size() - km1 + 1) {
				int s = 0;
				rep(j, km1) {
					s += d[i+j];
				}
				ret = max(ret, s);
				cout << "S : " << s << endl;
			}
			*/
		}
		rep(i, n) {
			if (used[i]) continue;
			d.clear();
			dfs(i, -1, true);
			//cout << ">"; for (auto&p : d) cout << " " << p; cout << endl;

			int s = 0;
			if (d.size() < k)continue;
			if (d.size() == k) {
				int s = 0;
				for (auto&v : d) s += v;
				ret = max(ret, s);
				continue;
			}
			int ds = d.size();
			rep(i, ds) d.push_back(d[i]);
			rep(i, km1) s += d[i];
			ret = max(ret, s);

			//cout << "Ss : " << s << endl;
			for (int i = km1; i < d.size(); ++i) {
				s -= d[i - km1];
				s += d[i];
				ret = max(ret, s);
				//cout << "S : " << s << endl;
			}
		}

		//cout << "# " << k * s*s * 6 << " " << ret << endl;

		if (ret == 0) {
			cout << -1 << endl;
		} else {
			cout << k * s*s * 6 - ret << endl;
		}



	}

}





Measured memory_bytes: 3192