rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+7;
int a[MAXN],b[MAXN],c[MAXN],f[MAXN],ls[MAXN],rs[MAXN],fa[MAXN],cnt,ans=1e18+7,tot;
struct node{
int u,v,s;
bool operator < (const node &x){
return s<x.s;
}
}g[MAXN];
int find(int x)
{
if(f[x]==x)
return x;
return f[x]=find(f[x]);
}
void dfs(int x,int sum)
{
if(!ls[x]&&!rs[x])
{
ans=min(ans,max(sum,c[x]));
return ;
}
dfs(ls[x],max(sum,c[x]-b[ls[x]]));
dfs(rs[x],max(sum,c[x]-b[rs[x]]));
}
signed main()
{
int n,m;
scanf("%lld%lld",&n,&m);
cnt=n;
for(int i(1);i<=n*2;++i)
f[i]=fa[i]=i;
for(int i(1);i<=n;++i)
{
scanf("%lld%lld",&a[i],&b[i]);
tot+=b[i];
c[i]=max(a[i]-b[i],0LL);
}
for(int i(1);i<=m;++i)
{
scanf("%lld%lld",&g[i].u,&g[i].v);
g[i].s=max(c[g[i].u],c[g[i].v]);
}
sort(g+1,g+m+1);
for(int i(1);i<=m;++i)
{
int fu=find(g[i].u),fv=find(g[i].v);
if(fu==fv)
continue;
int nowid=++cnt;
fa[fu]=fa[fv]=f[fu]=f[fv]=nowid;
ls[nowid]=fu;
rs[nowid]=fv;
c[nowid]=g[i].s;
}
for(int i(1);i<=cnt;++i)
b[fa[i]]+=b[i];
dfs(cnt-1,0);
printf("%lld",ans+tot);
return 0;
}