#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; }