#include<bits/stdc++.h>
#define forn(i, n) for (int i = 0; i < (n); i++)
#define forab(i, a, b) for (int i = (a); i <= (b); i++)
#define forba(i, b, a) for (int i = (b); i >= (a); i--)
#define mset(a, x, n) memset(a, x, sizeof(a[0]) * (n))
#define updiv(x, y) (((x) + (y) - 1) / (y)) // y > 0
#define pb(x) push_back(x)
#define eb emplace_back
#define mp(x, y) make_pair(x, y)
#define fi first
#define se second
#define sz(x) ((int)x.size())
#define all(x) (x).begin(), (x).end()
#ifdef hat
#define fast
#define de(x) cerr  << #x << '=' << (x) << ' '
#define dee(x) cerr  << #x << '=' << (x) << endl
#else
#define endl '\n'
#define fast ios::sync_with_stdio(0), cin.tie(0)
#define de(x) ((void) 0)
#define dee(x) ((void) 0)
#endif
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int, int> pii;
typedef vector<int> VI;

const int maxn = 50 + 5;
const int mod = 998244353;
const int INF = 0x3f3f3f3f;
const ll llINF = 0x3f3f3f3f3f3f3f3f;
ll make_compiler_happy() {return INF & maxn & mod & llINF;}
ll fpow(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll inv(ll x) {return fpow(x, mod-2);}
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());

int m, n;
vector<int> g[maxn * 2];
int match[maxn * 2];
bool vis[maxn * 2];

bool dfs(int u)
{
    vis[u] = 1;
    for(int v : g[u])
    {
        int w = match[v];
        if(w < 0 || (!vis[w] && dfs(w))) {
            match[v] = u;
            match[u] = v;
            return 1;
        }
    }
    return 0;
}

int bi_match()
{
    mset(match, -1, 2 * n + 1);
    int ans = 0;
    forab(i, 1, n)
        if(match[i] < 0) {
            mset(vis, 0, 2 * n + 1);
            if(dfs(i)) ans++;
        }
    return ans;
}

void addedge(int u, int v)
{
    g[u].pb(v + n);
}

bool dfs2(int u)
{
    vis[u] = 1;
    for(int v : g[u])
    {
        if(v == match[u]) continue;
        int w = match[v];
        vis[v] = 1;
        if(!vis[w]) dfs2(w);
    }
    return 0;
}

void find_set()
{
    mset(vis, 0, 2 * n + 1);
    forab(i, 1, n)
        if(match[i] == -1 && !vis[i]) {
            dfs2(i);
        }
}

ll x[maxn], y[maxn];
ll dp[maxn][maxn];
int from[maxn][maxn];
VI ans;

void print_ans(int i, int j)
{
    if(i == 0) {
        return;
    }
    print_ans(i - 1, from[i][j]);
    forn(t, j - from[i][j]) {
        ans.pb(-1);
    }
    ans.pb(0);
}

int main()
{
    fast;
    int k;
    cin >> n >> m >> k;
    forn(i, m)
    {
        int u, v;
        cin >> u >> v;
        addedge(u, v);
    }
    forab(i, 1, k)
        cin >> x[i] >> y[i];
    int res = n - bi_match();
    if(res > k) {
        cout << k << endl;
        forn(i, k)
            cout << 0 << ' ';
        cout << endl;
        return 0;
    }
    find_set();
    VI v;
    forab(i, 1, n)
    {
        if(!vis[i]) {
            v.pb(i);
        }
    }
    forab(i, n + 1, n + n)
    {
        if(vis[i]) {
            v.pb(i);
        }
    }
    forab(i, 0, n)
        forab(j, 0, n)
            dp[i][j] = -1e18;
    dp[0][res] = 0;
    forab(i, 1, k)
    {
        forab(j, i + 1, n)
        {
            forab(t, 0, j)
            {
                ll &d = dp[i][j];
                ll val = dp[i - 1][j - t] + max(0LL, x[i] - t * y[i]);
                if(val > d) {
                    d = val;
                    from[i][j] = j - t;
                }
            }
        }
    }
    print_ans(k, k + 1);
    cout << sz(ans) << endl;
    int cur = 0;
    for(int i : ans)
    {
        if(i == -1) {
            cout << (v[cur] > n ? n - v[cur] : v[cur]) << ' ';
            cur++;
        }
        else cout << i << ' ';
    }
    cout << endl;
}