#include<map>
#include<queue>
#include<time.h>
#include<limits.h>
#include<cmath>
#include<ostream>
#include<iterator>
#include<set>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep_1(i,m,n) for(int i=m;i<=n;i++)
#define mem(st) memset(st,0,sizeof st)
int read()
{
int res=0,ch,flag=0;
if((ch=getchar())=='-') //判断正负
flag=1;
else if(ch>='0'&&ch<='9') //得到完整的数
res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-'0';
return flag?-res:res;
}
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef pair<double,double> pdd;
const int inf = 0x3f3f3f3f;
const int N=2e5+10;
int w[N];
vector<int>ans;
vector<pii>e[N];
queue<int>q;
bool vis[N],in_ans[N];
void solve()
{
memset(vis,0,sizeof vis);
memset(in_ans,0,sizeof in_ans);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>w[i];
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
e[x].push_back({y,i});
w[x]--;
e[y].push_back({x,i});
w[y]--;
}
//这些是再怎么吃,都不会吃完的,那么就可以把这些人,安排到最后
//那另外一种食物吐出来
for(int i=1;i<=n;i++)
if(w[i]>=0)
q.push(i),vis[i]=1;
while(q.size())
{
int food=q.front();
q.pop();
for(auto p:e[food])
{
if(!in_ans[p.second])
ans.push_back(p.second),in_ans[p.second]=1;
if(!vis[p.first])
{
w[p.first]++;//把另外一种吐出来
if(w[p.first]>=0)
{
vis[p.first]=1;
q.push(p.first);
}
}
}
}
//倒着输出
if((int)ans.size()==m)
{
cout<<"ALIVE"<<endl;
for(int i=ans.size()-1;i>=0;i--)
cout<<ans[i]<<" ";
cout<<endl;
}
else
cout<<"DEAD"<<endl;
}
int main()
{
int t=1;
while(t--)
solve();
return 0;
}