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

#define sz(x) (int)((x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define endl '\n'
#define x first
#define y second
#define int long long
#define double long double
#define pii pair<int, int>
#define pb push_back
#define vec vector
#define beg begin
#define dbg(x) cerr << #x << " = " << x << endl;

template<class T> ostream& operator<<(ostream &str, vector<T> &a) {
    for (auto &i : a) {
        str << i << " ";
    }
    return str;
}

template<class T> istream& operator>>(istream &str, vector<T> &a) {
    for (auto &i : a) {
        str >> i;
    }
    return str;
}

template<class T> ostream& operator<<(ostream &str, pair<T, T> &a) {
    str << a.first << " " << a.second;
    return str;
}

template<class T> istream& operator>>(istream &str, pair<T, T> &a) {
    str >> a.first >> a.second;
    return str;
}

void solve(); signed main() {
#ifdef LOCAL
    freopen("C:\\Users\\artma\\CLionProjects\\problems\\input.txt", "r", stdin);
#endif
    srand(time(0));
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cout.setf(ios::fixed); cout.precision(6);
    solve();
    return 0;
}

const int MOD = 1e9 + 7, MAXN = 1e6 + 10, INF = 6e18 + 10, BASE = 37;
vec<int> c, p;

int f(vec<int> &cycle, int cnt) {
    if (cnt == 0) return 0;
    vec<int> a;
    a.pb(0);
    for (auto it : cycle) {
        a.pb(it);
    }
    for (auto it : cycle) {
        a.pb(it);
    }
    set<pii> se1, se2;
    se1.insert({0, 0});
    se2.insert({0, 0});
    int sum = 0;
    int ans = -INF;
    for (int i = 1; i < sz(a); ++i) {
        sum += c[a[i]];
        while (!se1.empty() && se1.begin()->x < i - cnt) {
            auto it = *(se1.begin());
            se1.erase(it);
            se2.erase({it.y, it.x});
        }
        ans = max(ans, sum - se2.begin()->x);
        se1.insert({i, sum});
        se2.insert({sum, i});
    }
    return ans;
}

void solve() {
    int n, k;
    cin >> n >> k;
    p.resize(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> p[i];
    }
    c.resize(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> c[i];
    }

    vec<vec<int>> cycles;
    vec<int> used(n + 1);
    for (int v = 1; v <= n; ++v) {
        if (!used[v]) {
            int i = p[v];
            vec<int> tmp;
            while (i != v) {
                used[i] = 1;
                tmp.pb(i);
                i = p[i];
            }
            used[v] = 1;
            tmp.pb(v);
            cycles.pb(tmp);
        }
    }

    int ans = -INF;
    for (auto cycle : cycles) {
        if (sz(cycle) <= k) {
            int cnt = k % sz(cycle);
            int sum = 0;
            for (auto it : cycle) {
                sum += c[it];
            }
            if (sum <= 0) {
                ans = max(ans, f(cycle, sz(cycle)));
            }
            else {
                ans = max({ans, (k / sz(cycle)) * sum + f(cycle, cnt), (k / sz(cycle) - 1) * sum + f(cycle, sz(cycle))});
            }
        }
        else {
            int cnt = k;
            ans = max(ans, f(cycle, cnt));
        }
    }

    cout << ans << endl;
}

Measured memory_bytes: 4492