const fi ='';
fo ='';
maxn =30000+3;
maxc =trunc(1e9)+3;
maxm =trunc(1e5);
type arrd =array[1..maxn] of longint;
arrf =array[1..maxn] of int64;
arrk =array[-maxm..maxm] of longint;
arrh =array[1..maxn] of longint;
var d1,dn,d :arrd;
f1,fn,f :arrf;
n,i,j,m :longint;
res :longint;
ans :arrd;
head :array[1..maxn] of longint;
link,ts,ke :arrk;
// dijkstra heap;
h,p :array[1..maxn] of longint;
nh :longint;
procedure add(i,u,v,w:longint);
begin
link[i]:=head[u];
head[u]:=i;
ke[i]:=v;
ts[i]:=w;
end;
procedure enter;
var u,v,w,k:longint;
begin
assign(input,fi);reset(input);
readln(n,m);
for i:=1 to m do
begin
read(k,u,v,w);
add(i,u,v,w);
if k=2 then add(-i,v,u,w);
end;
close(input);
end;
procedure swap(var x,y:longint);
var tg:longint;
begin
tg:=x;x:=y;y:=tg;
end;
procedure upheap(i:longint);
var j:longint;
begin
j:=i div 2;
if i>1 then
if d[h[i]] < d[h[j]] then
begin
swap(h[i],h[j]);
swap(p[h[i]],p[h[j]]);
upheap(j);
end;
end;
procedure downheap(i:longint);
var j:longint;
begin
j:=i + i;
if j>nh then exit;
if (j<nh) and (d[h[j]] > d[h[j+1]]) then inc(j);
if d[h[j]] < d[h[i]] then
begin
swap(h[i],h[j]);
swap(p[h[i]],p[h[j]]);
downheap(j);
end;
end;
procedure push(i:longint);
begin
inc(nh);
h[nh]:=i;
p[i]:=nh;
upheap(nh);
end;
function pop:longint;
begin
pop:=h[1];
h[1]:=h[nh];
p[h[1]]:=1;
dec(nh);
downheap(1);
end;
procedure update(i:longint);
begin
if p[i]=0 then push(i) else upheap(p[i]);
end;
procedure dijkstra(s:longint);
var u,v,i:longint;
begin
fillchar(h,sizeof(f),0);
fillchar(p,sizeof(p),0);
nh:=0;
fillchar(f,sizeof(f),0);
for i:=1 to n do d[i]:=maxc;
d[s]:=0;
f[s]:=1;
push(s);
repeat
u:=pop;
i:=head[u];
while i<>0 do
begin
v:=ke[i];
if d[v]>d[u]+ts[i] then
begin
d[v]:=d[u]+ts[i];
f[v]:=f[u];
update(v);
end
else
if d[v]=d[u]+ts[i] then
begin
f[v]:=f[u]+f[v];
end;
i:=link[i];
end;
until nh=0;
end;
procedure process;
begin
dijkstra(1);
f1:=f;
d1:=d;
dijkstra(n);
fn:=f;
dn:=d;
for i:=1 to n do
if (d1[i]+dn[i]<>d1[n])
or (f1[i]*fn[i]<>f1[n]) then
begin
inc(res);
ans[res]:=i;
end;
end;
procedure print;
begin
assign(output,fo);rewrite(output);
writeln(d1[n],' ',f1[n]);
close(output);
end;
begin
enter;
process;
print;
end.
Y29uc3QgICBmaSAgICAgID0nJzsKICAgICAgICBmbyAgICAgID0nJzsKICAgICAgICBtYXhuICAgID0zMDAwMCszOwogICAgICAgIG1heGMgICAgPXRydW5jKDFlOSkrMzsKICAgICAgICBtYXhtICAgID10cnVuYygxZTUpOwp0eXBlICAgIGFycmQgICAgPWFycmF5WzEuLm1heG5dIG9mIGxvbmdpbnQ7CiAgICAgICAgYXJyZiAgICA9YXJyYXlbMS4ubWF4bl0gb2YgaW50NjQ7CiAgICAgICAgYXJyayAgICA9YXJyYXlbLW1heG0uLm1heG1dIG9mIGxvbmdpbnQ7CiAgICAgICAgYXJyaCAgICA9YXJyYXlbMS4ubWF4bl0gb2YgbG9uZ2ludDsKdmFyICAgICBkMSxkbixkICAgOmFycmQ7CiAgICAgICAgZjEsZm4sZiAgIDphcnJmOwogICAgICAgIG4saSxqLG0gICA6bG9uZ2ludDsKICAgICAgICByZXMgICAgIDpsb25naW50OwogICAgICAgIGFucyAgICAgOmFycmQ7CiAgICAgICAgaGVhZCA6YXJyYXlbMS4ubWF4bl0gb2YgbG9uZ2ludDsKICAgICAgICBsaW5rLHRzLGtlICAgIDphcnJrOwogICAgICAgIC8vIGRpamtzdHJhIGhlYXA7CiAgICAgICAgaCxwICAgICA6YXJyYXlbMS4ubWF4bl0gb2YgbG9uZ2ludDsKICAgICAgICBuaCAgICAgIDpsb25naW50Owpwcm9jZWR1cmUgYWRkKGksdSx2LHc6bG9uZ2ludCk7CmJlZ2luCiAgICAgICAgbGlua1tpXTo9aGVhZFt1XTsKICAgICAgICBoZWFkW3VdOj1pOwogICAgICAgIGtlW2ldOj12OwogICAgICAgIHRzW2ldOj13OwplbmQ7CnByb2NlZHVyZSBlbnRlcjsKdmFyICAgICB1LHYsdyxrOmxvbmdpbnQ7CmJlZ2luCiAgICAgICAgYXNzaWduKGlucHV0LGZpKTtyZXNldChpbnB1dCk7CiAgICAgICAgcmVhZGxuKG4sbSk7CiAgICAgICAgZm9yIGk6PTEgdG8gbSBkbwogICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChrLHUsdix3KTsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkKGksdSx2LHcpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiBrPTIgdGhlbiBhZGQoLWksdix1LHcpOwogICAgICAgICAgICAgICAgZW5kOwogICAgICAgIGNsb3NlKGlucHV0KTsKZW5kOwpwcm9jZWR1cmUgc3dhcCh2YXIgeCx5OmxvbmdpbnQpOwp2YXIgICAgIHRnOmxvbmdpbnQ7CmJlZ2luCiAgICAgICAgdGc6PXg7eDo9eTt5Oj10ZzsKZW5kOwpwcm9jZWR1cmUgdXBoZWFwKGk6bG9uZ2ludCk7CnZhciAgICAgajpsb25naW50OwpiZWdpbgogICAgICAgIGo6PWkgZGl2IDI7CiAgICAgICAgaWYgaT4xIHRoZW4KICAgICAgICBpZiBkW2hbaV1dIDwgZFtoW2pdXSB0aGVuCiAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICBzd2FwKGhbaV0saFtqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAocFtoW2ldXSxwW2hbal1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXBoZWFwKGopOwogICAgICAgICAgICAgICAgZW5kOwplbmQ7CnByb2NlZHVyZSBkb3duaGVhcChpOmxvbmdpbnQpOwp2YXIgICAgIGo6bG9uZ2ludDsKYmVnaW4KICAgICAgICBqOj1pICsgaTsKICAgICAgICBpZiBqPm5oIHRoZW4gZXhpdDsKICAgICAgICBpZiAoajxuaCkgYW5kIChkW2hbal1dID4gZFtoW2orMV1dKSB0aGVuIGluYyhqKTsKICAgICAgICBpZiBkW2hbal1dIDwgZFtoW2ldXSB0aGVuCiAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICBzd2FwKGhbaV0saFtqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAocFtoW2ldXSxwW2hbal1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmhlYXAoaik7CiAgICAgICAgICAgICAgICBlbmQ7CmVuZDsKcHJvY2VkdXJlIHB1c2goaTpsb25naW50KTsKYmVnaW4KICAgICAgICBpbmMobmgpOwogICAgICAgIGhbbmhdOj1pOwogICAgICAgIHBbaV06PW5oOwogICAgICAgIHVwaGVhcChuaCk7CmVuZDsKZnVuY3Rpb24gcG9wOmxvbmdpbnQ7CmJlZ2luCiAgICAgICAgcG9wOj1oWzFdOwogICAgICAgIGhbMV06PWhbbmhdOwogICAgICAgIHBbaFsxXV06PTE7CiAgICAgICAgZGVjKG5oKTsKICAgICAgICBkb3duaGVhcCgxKTsKZW5kOwpwcm9jZWR1cmUgdXBkYXRlKGk6bG9uZ2ludCk7CmJlZ2luCiAgICAgICAgaWYgcFtpXT0wIHRoZW4gcHVzaChpKSBlbHNlIHVwaGVhcChwW2ldKTsKZW5kOwpwcm9jZWR1cmUgZGlqa3N0cmEoczpsb25naW50KTsKdmFyICAgICB1LHYsaTpsb25naW50OwpiZWdpbgogICAgICAgIGZpbGxjaGFyKGgsc2l6ZW9mKGYpLDApOwogICAgICAgIGZpbGxjaGFyKHAsc2l6ZW9mKHApLDApOwogICAgICAgIG5oOj0wOwogICAgICAgIGZpbGxjaGFyKGYsc2l6ZW9mKGYpLDApOwogICAgICAgIGZvciBpOj0xIHRvIG4gZG8gZFtpXTo9bWF4YzsKICAgICAgICBkW3NdOj0wOwogICAgICAgIGZbc106PTE7CiAgICAgICAgcHVzaChzKTsKICAgICAgICByZXBlYXQKICAgICAgICAgICAgICAgIHU6PXBvcDsKICAgICAgICAgICAgICAgIGk6PWhlYWRbdV07CiAgICAgICAgICAgICAgICB3aGlsZSBpPD4wIGRvCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjo9a2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZFt2XT5kW3VdK3RzW2ldIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbdl06PWRbdV0rdHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZbdl06PWZbdV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRbdl09ZFt1XSt0c1tpXSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW3ZdOj1mW3VdK2Zbdl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTo9bGlua1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgIHVudGlsIG5oPTA7CmVuZDsKcHJvY2VkdXJlIHByb2Nlc3M7CmJlZ2luCiAgICAgICAgZGlqa3N0cmEoMSk7CiAgICAgICAgZjE6PWY7CiAgICAgICAgZDE6PWQ7CiAgICAgICAgZGlqa3N0cmEobik7CiAgICAgICAgZm46PWY7CiAgICAgICAgZG46PWQ7CiAgICAgICAgZm9yIGk6PTEgdG8gbiBkbwogICAgICAgICAgICAgICAgaWYgKGQxW2ldK2RuW2ldPD5kMVtuXSkKICAgICAgICAgICAgICAgIG9yIChmMVtpXSpmbltpXTw+ZjFbbl0pIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmMocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnNbcmVzXTo9aTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOwplbmQ7CnByb2NlZHVyZSBwcmludDsKYmVnaW4KICAgICAgICBhc3NpZ24ob3V0cHV0LGZvKTtyZXdyaXRlKG91dHB1dCk7CiAgICAgICAgd3JpdGVsbihkMVtuXSwnICcsZjFbbl0pOwogICAgICAgIGNsb3NlKG91dHB1dCk7CmVuZDsKYmVnaW4KICAgICAgICBlbnRlcjsKICAgICAgICBwcm9jZXNzOwogICAgICAgIHByaW50OwplbmQu