#include<cstdio>
#include<algorithm>
#define N 1001
using namespace std;
int n,a[N],b[N];
int front[N],nxt[N*N],to[N*N],tot,from[N*N];
int col[N],cnt;
int st[N],top;
int dfn[N],low[N],tim;
bool ins[N];
int in[N];
int na[N],nb[N];
int dp[15001];
void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u;
}
void init()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
int x,y;
while(scanf("%d%d",&x,&y)!=EOF) add(x,y);
}
void tarjan(int u)
{
dfn[u]=low[u]=++tim;
ins[u]=true; st[++top]=u;
for(int i=front[u];i;i=nxt[i])
if(!dfn[to[i]]) tarjan(to[i]),low[u]=min(low[u],low[to[i]]);
else if(ins[to[i]]) low[u]=min(low[u],dfn[to[i]]);
if(low[u]==dfn[u])
{
col[u]=++cnt; ins[u]=false;
na[cnt]=a[u]; nb[cnt]=b[u];
while(st[top]!=u)
{
na[cnt]=min(na[cnt],a[st[top]]);
nb[cnt]=min(nb[cnt],b[st[top]]);
col[st[top]]=cnt;ins[st[top--]]=false;
}
top--;
}
}
void solve()
{
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=tot;i++)
if(col[from[i]]!=col[to[i]]) in[col[to[i]]]++;
int m=0;
for(int i=1;i<=cnt;i++)
if(!in[i]) m+=na[i];
for(int i=1;i<=cnt;i++)
if(!in[i])
for(int j=m;j>=0;j--)
if(j-na[i]>=0) dp[j]=min(dp[j-na[i]],dp[j]+nb[i]);
else dp[j]+=nb[i];
int ans=m;
for(int i=m;i>=0;i--) ans=min(ans,max(i,dp[i]));
printf("%d",ans);
}
int main()
{
init();
solve();
}