/*

                         YATIN KWATRA                       _03_08_14


Let's Hoop..



                             __oooo
       //  /    o
     / /  |      o
    | /  |__     o
   | |   __/    o
   | |  /  oooo
  | /  |  _______________________
 | |   | |_______________________|
||    |___ \__/\_/\_/\/\/\/\/\/\/
||    |    \ \/\/\/\/\/\/\/\/\/
||    \     \ \/\/\/\/\/\/\/\/
| |    |    |  \/\/\/\/\/\/\/
 | |    |   |   \/\/\/\/\/\/
  | |    \_/    |\/\/\/\/\/|
   \ \     \__  |/\/\/\/\/\|
    |         \
   |           |
   |           |
   |           |
   |           |
    |          |
    |         |
     |________|
     |________|
    ||         |
   | |          |
  |  /          |
 |  /          /
 /\|__________|
|   /       /
|  |       /
| |       |
 \ |      \
  \ \      \
    \ \     |
      \ \    |
        \ \  |_
          \\_/ \
           |    |
           |   /
           |  |
           |_/



HOOPER_4_LYF..

*/

// AC BAKSHI RABBA

// #pragma GCC optimize "trapv"

#include <bits/stdc++.h>
#define ll                      long long
#define ld                      long double
#define ull                     unsigned long long
#define FIO                     ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define endl                    "\n"
#define fo(i,a,b)               for(int i = a; i<=b ; i++)
#define rfo(i,a,b)              for(int i = a; i>=b ; i--)
#define vii                     vector<int>
#define vll                     vector<ll>
#define pq                      priority_queue
#define uom                     unordered_map
#define all(v)                  v.begin(),v.end()
#define mp                      make_pair
#define pb                      push_back
#define pob                     pop_back
#define ff                      first
#define ss                      second
#define pii                     pair<int,int>
#define pll                     pair<ll,ll>
#define mll                     map<ll,ll>
#define mii                     map<int,int>
#define vvii                    vector<vii>
#define vvll                    vector<vll>
#define mod                     1000000007
#define MIN                     -1e9
#define pi                      3.1415926535897932384626433832795

using namespace std;

void INPUT()
{
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
}

/*

   -> Check For Overflows
   -> Out of Bounds
   -> Initialisations of global arrays and variables
   -> Read the Question and the sample test cases carefully
   -> Its not Always Complex, Try to simplify
   -> write it down and try to solve
   -> Have Faith in urself and in ur approach
   -> If it seems totally out of reach, switch to next :)
   -> And Come Back later, if possible ..



o- - -  \o          __|
   o/   /|          vv`\
  /|     |              |
   |    / \_            |
  / \   |               |
 /  |                   |


   Thats what I call a Tappu / Blocked_shot / Rejection...


   Time to Code Now.....
*/

const int N = 5005;

vector<pll> v[N];
int cycle;

void dfs(int node, vll &vis, vll &temp, int moves)
{
  vis[node] = 1;

  if (moves == 0) return;

  for (auto &i : v[node])
  {
    if (!vis[i.ff])
    {
      temp.pb(i.ss);
      dfs(i.ff, vis, temp, moves - 1);
    }
    else
    {
      temp.pb(i.ss);
      cycle = 1;
      return;
    }

    if (cycle == 1) return;
  }

  if (cycle == 1) return;
}

void solve()
{

  ll n, k, x, y;
  cin >> n >> k;

  fo(i, 0, N - 1) v[i].clear();

  vll perm(n), a(n);

  fo(i, 0, n - 1) cin >> perm[i];
  fo(i, 0, n - 1) cin >> a[i];

  fo(i, 0, n - 1)
  {
    x = i;
    y = perm[i];
    y--;

    v[x].pb(mp(y, a[y]));
  }

  ll mx = -1e18;
  ll sum = 0;

  fo(i, 0, n - 1)
  {
    cycle = -1;

    vll vis(n, 0);
    vll temp;

    sum = 0;

    dfs(i, vis, temp, k);

    ll l_mx = -1e18;

    for (auto &i : temp)  sum += i, l_mx = max(l_mx, sum);

    //  cout << " sum : " << sum << endl;

    if (cycle == -1) mx = max(mx, max(sum, l_mx));
    else
    {
      if (sum < 0)
      {
        mx = max(mx, l_mx);
        continue;
      }

      ll sz = temp.size();

      ll di = k / sz;


      ll got = (di - 1) * sum;

      ll rem = k - ((di - 1) * sz);

      ll best = 0 , cur = 0;

      int j = 0;

      while (rem--)
      {
        cur += temp[j];
        best = max(best, cur);
        j++;
        j %= sz;
      }

      got += best;
      mx = max(mx, got);
    }
  }

  cout << mx << endl;


}

int main() {

  FIO
  INPUT();

  int t;
  t = 1;
// cin >> t;

  fo(i, 0, t - 1)
  {
    solve();
  }
  return 0;
}


Measured memory_bytes: 4312