#include <bits/stdc++.h>
#define ll              long long
#define el              cout << '\n'
#define f(i, a, b)      for(long long i = a; i <= b; ++i)
#define fv(i, a, b)     for(long long i = a; i >= b; i--)
#define ft              first
#define sd              second
#define pll             pair<long long,long long>
#define vll             vector<long long>
#define ep              emplace_back
#define pb              push_back
using namespace std;
const ll oo = 1e18+123, N = 2e5+5, MOD = 1e9+7;

void Initialization();

ll test, n, m, ans, k, c[N], deg[N], topo[N], dp[N][31];
vector<vll> E;

void solve() {
    queue<pll> q;
    f(i, 1, n) {
        dp[i][1] = c[i]; q.push({i, 0}); q.push({i, 1});
    }
    while(!q.empty()) {
        int u = q.front().ft, i = q.front().sd; q.pop();
        for(int v : E[u]) {
            if(dp[v][i + 1] < dp[u][i] + c[v]) {
                dp[v][i + 1] = dp[u][i] + c[v];
                q.push({v, i + 1});
            } 
            if(dp[v][i] < dp[u][i]) {
                dp[v][i] = dp[u][i];
                q.push({v, i});
            } 

        } 
    }
    f(u, 1, n) f(z, 1, k) ans = max(ans, dp[u][z]);
    cout << ans;
}

void topo_sort() {
    queue<ll> q;
    f(i, 1, n) if(!deg[i]) q.push(i);
    
    vll vis(n + 1, 0);
    ll cnt = 0;
    while(!q.empty()) {
        ll u = q.front(); q.pop();  
        if(vis[u]) continue; vis[u] = 1;
        topo[++cnt] = u;
        for(ll v : E[u]) {
            deg[v]--;
            if(deg[v] == 0) q.push(v);
        }
    }
}

void sub1() {
    sort(c + 1, c + n + 1);
    fv(i, n, n - k + 1) ans += c[i];
    cout << ans; 
}

void sub23() {
    topo_sort();

    f(i, 1, n) {
        ll u = topo[i];
        dp[u][1] = max(c[u], dp[u][1]);
        for(int v : E[u]) 
            f(z, 1, k) 
                dp[v][z] = max(
                    dp[v][z], 
                    max(dp[u][z - 1] + c[v], dp[u][z])
                ); 
    }
    
    f(u, 1, n) f(z, 1, k) ans = max(ans, dp[u][z]);
    cout << ans;
}

ll low[N], num[N], tp[N], Time, cc;
bool dele[N];
stack<ll> st;
vector<vll> ma(1);

void tarjan (ll u) {
    low[u] = num[u] = ++Time;
    st.push(u);

    for(ll v : E[u]) {
        if(dele[v]) continue;
        if(num[v]) low[u] = min(low[u], num[v]);
        else {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        }
    }

    if(num[u] == low[u]) {
        cc++;
        ll v = 0;
        vll dmp;
        
        while(v != u) {
            v= st.top(); st.pop();
            dmp.pb(c[v]);
            tp[v] = cc;
            dele[v] = 1;
        }
        sort(dmp.begin(), dmp.end(), greater<ll>());
        ma.pb({0});
        ll sum = 0;
        for(ll x : dmp) {
            sum += x; ma[cc].pb(sum);
        }
        // cout << cc << '.', el;
        // for(ll x : dmp) cout << x << ' '; el;
        // for(ll x : ma[cc]) cout << x << ' '; el;
    }
}

ll degd[N];
vector<vll> Ed, Er;

void sub4() {
    f(u, 1, n) if(num[u] == 0) tarjan(u);
    Ed.resize(cc + 1);
    Er.resize(cc + 1);
    f(u, 1, n) 
        for(ll v : E[u]) if(tp[u] != tp[v]) {
            Er[tp[v]].pb(tp[u]);
            Ed[tp[u]].pb(tp[v]); degd[tp[v]] ++;
        }
            
    queue<ll> q;
    f(i, 1, cc) if(!degd[i]) q.push(i);
    
    ll cnt = 0;
    // f(i, 1, cc) cout << i << ' '; el;
    // f(i, 1, cc) cout << degd[i] << ' '; el;
    // f(i, 1, cc) {
    //     cout << i << ":";
    //     for(ll v : Er[i]) cout << v << ' '; el;
    // }
    while(!q.empty()) {
        ll u = q.front(); q.pop();  
        
        topo[++cnt] = u;
        for(ll v : Ed[u]) {
            degd[v]--;
            if(degd[v] == 0) q.push(v);
        }
    }

    
    f(o, 1, cc) {
        ll u = topo[o];
        f(i, 1, ma.size() - 1) dp[u][i] = ma[u][i];

        f(z, 1, k) {
            for(ll v : Er[u]) {
                f(j, 0, min(z, (ll) (ma[u].size() - 1))) 
                    dp[u][z] = max(
                        dp[u][z], 
                        dp[v][z - j] + ma[u][j]
                    );
            }
        }
    }

    // cout << cc, el;

    // f(i, 1, cc) cout << topo[i] << ' '; el;


    // f(i, 1, n) cout << i << ' '; el;
    // f(i, 1, n) cout << tp[i] << ' '; el;

    // f(u, 1, cc) {
    //     f(z, 1, k) {
    //         cout << dp[u][z] << ' ';
    //     } el;
    // }

    f(u, 1, cc) f(z, 1, k) ans = max(ans, dp[u][z]);
    cout << ans;

}

int main()
{
    Initialization();
    
    cin >> n >> m >> k;
    E.resize(n + 1);
    f(i, 1, n) cin >> c[i];

    ll u, v;
    f(i, 1, m) {
        cin >> u >> v;
        E[u].pb(v); deg[v] ++;
    }

    //if(n < 20) sub1();
    // solve(); return 0;
    sub4();

    

    return 0;
}

void Initialization() {
    #define thukem "produce"
    if(fopen(thukem".inp", "r")) {
        freopen(thukem".inp","r",stdin);
        freopen(thukem".out","w",stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
}