#include <bits/stdc++.h>
using namespace std;
#define y1 hld
#define int long long
#define pii pair<int, int>
#define vi vector<int>
#define vii vector<pii>
#define fi first
#define se second
#define big (int)1e18
#define small (int)1e9
#define mouse (int)-1e18
#define cat (int)-1e9
#define pb push_back
#define eb emplace_back
#define tri pair<int, pair<int, int>>
#define a1 fi
#define a2 se.fi
#define a3 se.se
#define quad pair<pair<int, int>, pair<int, int>>
#define b1 fi.fi
#define b2 fi.se
#define b3 se.fi
#define b4 se.se
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define srt(x) sort(all(x));
#define bit(x, i) ((x >> i) & 1)
#define mask(i) (1LL << i)
#define sz(x) (int)x.size()
#define uni(x) sort(all(x)), x.erase(unique(all(x)), x.end())
#define debug(x) cerr << x << ' '
#define debg(x) cerr << x << '\n'
#define deb(x, y) cerr << x << ' ' << y << '\n'
#define de(x, y, z) cerr << x << ' ' << y << ' ' << z << '\n'
#define htbd(x, y, z, t) cerr << x << ' ' << y << ' ' << z << ' ' << t << '\n'
template <class T>
using minheap = priority_queue<T, vector<T>, greater<T>>;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
tri t3(int a, int b, int c) { return {a, {b, c}}; }
quad t4(int a, int b, int c, int d) { return {{a, b}, {c, d}}; }
void ptri(tri x) { cerr << x.a1 << ' ' << x.a2 << ' ' << x.a3 << '\n'; }
void pquad(quad x) {
    cerr << x.b1 << ' ' << x.b2 << ' ' << x.b3 << ' ' << x.b4 << '\n';
}
int ceil_div(int a, int b) { return (a + b - 1) / b; }
#define fill0(x) memset(x, 0, sizeof x)
#define f36(x) memset(x, -1, sizeof x)
#define inf(x) memset(x, 0x3f, sizeof x)
#define nyc(x) memset(x, -0x3f, sizeof x)
#define loop(i, a, b) for (int i = (a); i <= (b); i++)
#define back(i, a, b) for (int i = (a); i >= (b); i--)
#define popcnt(x) __builtin_popcountll(x)
#define lb lower_bound
#define ub upper_bound
#define f59(a, b) a = min(a, b)
#define f69(a, b) a = max(a, b)
#define rep(i, n) for (int i = 1; i <= n; i++)
#define has(x, y) (x.find(y) != x.end())
#define each(x, a) for (auto &x : a)
#define lbit(x) (x & -x)
#define f(u, v) adj[u].push_back(v)
#define g(u, v, w) adj[u].push_back({v, w})
#define f2(u, v) (f(u, v), f(v, u))
#define g2(u, v, w) (g(u, v, w), g(v, u, w))
const int N = 2e5 + 5;
vector<int> adj[N];
int dist[N], p[N];
set<int> s;
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if (ifstream("WOTU.INP")) {
        freopen("WOTU.INP", "r", stdin);
        freopen("WOTU.OUT", "w", stdout);
    }
    memset(dist, 0x3f, sizeof dist);
    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i++) {
        int U, V;
        cin >> U >> V;
        f(V, U);
    }
    for (int i = 1; i <= n; i++) cin >> p[i];
    queue<int> q;
    q.push(n);
    dist[n] = 0;
    while (q.size()) {
        int u = q.front();
        q.pop();
        for (int v : adj[u])
            if (dist[v] > dist[u] + 1) dist[v] = dist[u] + 1, q.push(v);
    }
    for (int i = 1; i <= n; i++) s.insert(dist[p[i]] + i - 1);
    int x, y;
    while (k--) {
        cin >> x >> y;
        s.erase(s.find(dist[p[x]] + x - 1));
        s.erase(s.find(dist[p[y]] + y - 1));
        s.insert(dist[p[y]] + x - 1);
        s.insert(dist[p[x]] + y - 1);
        swap(p[x], p[y]);
        cout << *s.begin() << '\n';
    }
}