#define _GLIBCXX_DEBUG
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<int, int>; using vi = vector<int>; using vvi = vector<vi>; using vl = vector<ll>;
#define rep0(TMS) for (int CNT = 0; CNT < (int)(TMS); CNT++)
#define rep(CNT, GOAL) for (int CNT = 0; CNT < (int)(GOAL); CNT++)
#define rep2(CNT, START, GOAL) for (int CNT = (int)(START); CNT < (int)(GOAL); CNT++)
#define rep3(CNT, START, GOAL) for (int CNT = (int)(START); CNT > (int)(GOAL); CNT--)
#define all(CONT) begin(CONT), end(CONT)
#define itrep(ITR, CONT) for (auto ITR = begin(CONT); ITR != end(CONT); ITR++)
#define itrep1(ITR, CONT) for (auto ITR = next(begin(CONT)); ITR != end(CONT); ITR++)
template <typename T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template <typename T> bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; }
void prec(const int &DIG) { cerr << fixed << setprecision(DIG); cout << fixed << setprecision(DIG); }
template <typename T> void CERR(const T &ELEM) { cerr << ELEM; }
template <typename T, typename ...Ts> void CERR(const T &FIRST, const Ts &...REST) { CERR(FIRST); cerr << ", "; CERR(REST...); }
template <typename T1, typename T2> void CERR(const pair<T1, T2> &PAIR) { cerr << "("; CERR(PAIR.first); cerr << ", "; CERR(PAIR.second); cerr << ")"; }
template <typename T> void CERR(const vector<T> &VEC) { cerr << "{ "; itrep(ITR, VEC) { CERR(*ITR); cerr << ", "; } cerr << "}"; }
template <typename T> void CERR1(const vector<T> &VEC) { cerr << "{ "; itrep1(ITR, VEC) { CERR(*ITR); cerr << ", "; } cerr << "}"; }
template <typename T> void CERR(const set<T> &SET) { cerr << "{ "; itrep(ITR, SET) { CERR(*ITR); cerr << ", "; } cerr << "}"; }
template <typename T> void CERR(const multiset<T> &MULTISET) { cerr << "{ "; itrep(ITR, MULTISET) { CERR(*ITR); cerr << ", "; } cerr << "}"; }
template <typename T1, typename T2> void CERR(const map<T1, T2> &MAP) { cerr << "{ "; itrep(ITR, MAP) { CERR(*ITR); cerr << ", "; } cerr << "}"; }
#define db(OBJ) cerr << #OBJ << ": "; CERR(OBJ); cerr << ", "
#define dbl(OBJ) cerr << #OBJ << ": "; CERR(OBJ); cerr << "\n"
#define db1(OBJ) cerr << #OBJ << ": "; CERR1(OBJ); cerr << "\n"
#define dbs(...) cerr << "(" << #__VA_ARGS__ << "): ("; CERR(__VA_ARGS__); cerr << ")\n"
#define dbvv(VV) cerr << #VV << ": {\n"; rep(CNT, VV.size()) { cerr << #VV << "[" << CNT << "]: "; CERR(VV[CNT]); cerr << ",\n"; } cerr << "}\n"
#define db01(VV) cerr << #VV << ": {\n"; rep(CNT, VV.size()) { cerr << #VV << "[" << CNT << "]: "; CERR1(VV[CNT]); cerr << ",\n"; } cerr << "}\n"
#define db10(VV) cerr << #VV << ": {\n"; rep2(CNT, 1, VV.size()) { cerr << #VV << "[" << CNT << "]: "; CERR(VV[CNT]); cerr << ",\n"; } cerr << "}\n"
#define db11(VV) cerr << #VV << ": {\n"; rep2(CNT, 1, VV.size()) { cerr << #VV << "[" << CNT << "]: "; CERR1(VV[CNT]); cerr << ",\n"; } cerr << "}\n"
#define YN(FLG) cout << (FLG ? "YES" : "NO") << "\n"
#define Yn(FLG) cout << (FLG ? "Yes" : "No") << "\n"
#define yn(FLG) cout << (FLG ? "yes" : "no") << "\n"
const ll INF = 1'000'000'000'000'000'007;
// const int INF = 1'000'000'007;
const ll MOD = 1'000'000'007; // 998'244'353;

// loopに分割
int N, K;
vl P, C;
vvi l; // loops
int m; // ループの数
vl sum_round; // s[i]=i番目のループのCjの和
vl s2l; // 始点s->それが含まれるループの番号

ll round (int s, int R) {
	assert(R <= l[s2l[s]].size());
	// sから0回以上R回以下移動したときのmax
	int cur = s;
	ll temp = 0, res = temp;
	rep0(R) {
		cur = P[cur];
		temp += C[cur];
		chmax(res, temp);
	}
	return res;
}

ll solve(int s) {
	int cur = P[s]; // ここから0回以上K-1回以下移動
	// 得点はC[P[s]]が始めに入る

	int j = s2l[cur]; // loopの番号
	ll sum_C = sum_round[j]; // そのloop1周の点数の和

	if (sum_C < 0) { // 1周してはいけない
		return C[P[s]] + round(cur, min((int)l[j].size(), K - 1));
	} else if (sum_C == 0) { // 1周を超えて動いてはいけない
		return C[P[s]] + round(cur, min((int)l[j].size(), K));
	} else if (sum_C > 0) {
		ll Q = (K - 1) / l[j].size(), R = (K - 1) % l[j].size();
		return C[P[s]] + sum_round[j] * Q + round(cur, R);
	}
}


int main() {
	// 1-ind
	cin >> N >> K;
	P = C = vl(N + 1);
	rep2(i, 1, N + 1) cin >> P[i];
	rep2(i, 1, N + 1) cin >> C[i];

	vector<bool> r(N + 1); // reached
	
	rep2(s, 1, N + 1) {
		// dbs(s, P[s], r[s]);
		if (r[s]) continue;
		vi li; // sを含むループ
		int t = s;
		li.push_back(t); r[t] = true;
		while (true) {
			if (P[t] == s) {
				l.push_back(li);
				break;
			} else {
				t = P[t];
				li.push_back(t); r[t] = true;
			}
		}
	}
	// dbl(l);
	m = l.size();

	sum_round = vl(m);
	rep (i, m) {
		for (int j : l[i]) {
			sum_round[i] += C[j];
		}
	}
	// dbl(sum_round);

	s2l = vl(N + 1);
	rep(j, m) {
		for (int s : l[j]) s2l[s] = j;
	}
	// dbl(s2l);

	ll ans = -INF;

	rep2(s, 1, N + 1) {
		chmax(ans, solve(s));
	}

	cout << ans << endl;
}

Measured memory_bytes: 3876