#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
typedef double db;
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define low(x) ((x)&-(x))
#define all(x) x.begin(),x.end()
#define mp make_pair
#define X first
#define Y second
#ifdef _DEBUG
    const int N=1e3+10;
#else
    const int N=1e6+10;
#endif
const ll mod=1e9+7;
inline ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
inline ll q_pow(ll a,ll x){ll ans=1,tmp=a;while(x){if(x&1)(ans*=tmp)%=mod;(tmp*=tmp)%=mod;x>>=1;}return ans;}
template<typename T> inline void re(T &N){int f=1;char c;while((c=getchar())< '0'||c> '9')if(c=='-')f=-1;N=c-'0';while((c=getchar())>='0'&&c<='9')N=N*10+c-'0';N*=f;}
int m,n,t=1,st,en,K;
template<class T>
struct MF{
    struct edge{
        int v;
        T cap;
        edge(){}
        edge(int v=0,T cap=0):v(v),cap(cap){}
    };

    int m,n,st,en;
    T flow,inf=typeid(T)==typeid(int)?1e9:1e18;
    vector<edge> edges;
    vector< vector<int> > G;
    vector<int> dep,cur,vis;
    
    void init(int _n)
    {
        flow=0;
        G.assign(n+1,vector<int>());
        dep.assign(n+1,-1);
        cur.assign(n+1,0);
        vis.assign(n+1,0);
        edges.clear();
    }
	void build(int _n)
    {
        n=_n;st=n-1;en=n;
        init(n);
    }
    void build(int _n,int _st,int _en)
    {
        n=_n;st=_st;en=_en;
        init(n);
    }
    void add(int u,int v,T cap)
    {
        if(u==v)return;
        edges.emplace_back(v,cap);
        edges.emplace_back(u,0);
        m=edges.size();
        G[u].push_back(m-2);
        G[v].push_back(m-1);
    }
    int bfs()
    {
        fill(dep.begin(),dep.end(),-1);
        queue<int>q;
        q.push(st);
        dep[st]=0;
        while(!q.empty())
        {
            int u=q.front();q.pop();
            for(int i=0;i< G[u].size();i++)
            {
                edge& e=edges[G[u][i]];
                if(dep[e.v]==-1 && e.cap)
                {
                    q.push(e.v);
                    dep[e.v]=dep[u]+1;
                }
            }
        }
        return dep[en]!=-1;
    }
    T dfs(int u,T lim)
    {
        if(u==en || !lim)return lim;
        T flow=0;
        for(int& i=cur[u];i< G[u].size();i++)
        {
            edge& e=edges[G[u][i]];
            if(dep[e.v]!=dep[u]+1||!e.cap)continue;
            T tmp=dfs(e.v,min(lim,e.cap));
            e.cap-=tmp;edges[G[u][i]^1].cap+=tmp;
            lim-=tmp;flow+=tmp;
            if(!lim)break;
        }
        return flow;
    }
    T get()
    {
        while(bfs())
        {
            fill(cur.begin(),cur.end(),0);
            flow+=dfs(st,inf);
        }
        return flow;
    }
    void dfs(int x)
    {
        vis[x]=1;
        for(int i=0;i< G[x].size();i++)
        {
            edge& e=edges[G[x][i]];
            if(vis[e.v]||!e.cap)continue;
            dfs(e.v);
        }
    }
};
MF<int>f;
queue<int>ans;
stack<int>out;
pl a[110];
ll d[110][110],p[110][110];
int main()
{
    #ifdef _DEBUG
        freopen("data.txt","r",stdin);
    #endif
    re(n);re(m);re(K);
    f.build(2*n+10);
    for(int i=1;i<=n;i++)
    {
        f.add(f.st,i,1);
        f.add(i+n,f.en,1);
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        re(x);re(y);
        f.add(x,y+n,1);
    }
    for(int i=1;i<=K;i++)re(a[i].X),re(a[i].Y);
    int now=n-f.get()-1;
    f.dfs(f.st);
    for(int i=1;i<=n;i++)
    {
        if(!f.vis[i])ans.push(i);
        if(f.vis[i+n])ans.push(-i);
    }
    fill(d[0],d[0]+(int)(sizeof(d)/8),-1e18);
    d[0][now]=0;
    for(int i=1;i<=K;i++)
    {
        for(int j=i-1;j<=n;j++)if(d[i-1][j]>=0)
            for(int k=0;j+k<=n;k++)if(j+k>=i)
            {
                if(d[i][j+k]< d[i-1][j]+max(0ll,a[i].X-a[i].Y*k))
                {
                    d[i][j+k]=d[i-1][j]+max(0ll,a[i].X-a[i].Y*k);
                    p[i][j+k]=j;
                }
            }
    }
    int pos=K;
    for(int i=K+1;i<=n;i++)
        if(d[K][i]> d[K][pos])pos=i;
    for(int i=K;i>=1;i--)
    {
        out.push(0);
        int newpos=p[i][pos];
        for(int j=newpos+1;j<=pos;j++)
            out.push(ans.front()),ans.pop();
        pos=newpos;
    }
    printf("%d\n",(int)out.size());
    while(!out.empty())
        printf("%d ",out.top()),out.pop();
    puts("");
    return 0;
}
